qt 中 Qqt listwidget的用法拖动问题

FinderCheng 的BLOG
用户名:FinderCheng
文章数:123
评论数:1011
访问量:3806185
注册日期:
51CTO推荐博文
前面一节简单概述著名的MVC模式在Qt中的实现,现在我们从QListWidget开始了解Qt提供的一系列方便的item view类。
第一个要说的是QListWidget。这个类为我们展示一个List列表的视图。下面还是先看代码:
listwidget.h
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />#ifndef LISTWIDGET_H 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />#define LISTWIDGET_H 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />#include &QtGui& 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />class ListWidget : public QWidget 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />{ 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />public: 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&ListWidget(); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />private: 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QLabel * 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QListWidget * 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />}; 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />#endif // LISTWIDGET_H
listwidget.cpp
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />#include "listwidget.h" 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />ListWidget::ListWidget() 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />{ 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&label = new QL 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&label-&setFixedWidth(70); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&list = new QListW 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&list-&addItem(new QListWidgetItem(QIcon(":/images/line.PNG"), tr("Line"))); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&list-&addItem(new QListWidgetItem(QIcon(":/images/rect.PNG"), tr("Rectangle"))); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&list-&addItem(new QListWidgetItem(QIcon(":/images/oval.PNG"), tr("Oval"))); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&list-&addItem(new QListWidgetItem(QIcon(":/images/tri.PNG"), tr("Triangle"))); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QHBoxLayout *layout = new QHBoxL 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&layout-&addWidget(label); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&layout-&addWidget(list); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&setLayout(layout); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&connect(list, SIGNAL(currentTextChanged(QString)), label, SLOT(setText(QString))); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />}
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />#include &QtGui& 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />#include "listwidget.h" 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" /> 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />int main(int argc, char *argv[]) 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />{ 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&QApplication a(argc, argv); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&ListW 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&lw.resize(400, 200); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&lw.show(); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />&&&&&&&&return a.exec(); 650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />}
一共三个文件,但是都比较清晰。我们先建立了一个ListWidget类,然后在main函数中将其显示出来。
ListWidget类中包含一个QLabel对象和一个QListWidget对象。创建这个QListWidget对象很简单,只需要使用new运算符创建出来,然后调用addItem()函数即可将item添加到这个对象中。我们添加的对象是QListWidgetItem的指针,它有四个重载的函数,我们使用的是其中的一个,它接受两个参数,第一个是QIcon引用类型,作为item的图标,第二个是QString类型,作为这个item后面的文字说明。当然,我们也可以使用insertItem()函数在特定的位置动态的增加item,具体使用请查阅API文档。最后,我们将这个QListWidget的currentTextChanged()信号同QLabel的setText()连接起来,这样,在我们点击item的时候,label上面的文字就可以改变了。
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
border="0" alt="" src="/attachment/661593.png" />
我们还可以设置viewModel这个参数,来确定使用不同的视图进行显示。比如,我们使用下面的语句:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
align="top" src="http://devbean./images/editer/InBlock.gif" />list-&setViewMode(QListView::IconMode);
再来看看程序界面吧!
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
border="0" alt="" src="/attachment/793140.png" />本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》
22:01:52 22:45:19 10:40:33 13:46:43 12:42:49 12:44:19 15:12:34 15:16:00 16:43:25 19:28:02 18:47:31 11:08:06 11:55:49 14:40:37 19:29:57 09:43:28 23:52:50 20:58:01 10:13:04 15:53:37 &&1&
&&页数 ( 1/2 ) &问题:如何实现在一个列表中点击右键,如果在Item上面,则有“修改”选项,在其余空白处,则只有“添加”,&删除&选项。
实现右键菜单, 从QListWidget中派生出ListWidget,重写
void QWidget::contextMenuEvent ( QContextMenuEvent * event )&& [virtual protected]
当鼠标在ListWidget中右击时,就会调用这个事件。
void ListWidget::contextMenuEvent ( QContextMenuEvent * event )
&&& QMenu* popMenu = new QMenu(this);
&&& popMenu-&addAction(new QAction(&添加&, this));
&&& popMenu-&addAction(new QAction(&删除&, this));
&&& popMenu-&addAction(new QAction(&修改&, this));
&&& popMenu-&exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置
在程序中使用ListWidget,当鼠标在之上右击时, 就会出现如上代码中的菜单,但是无论右击何处,都会相出现相同的选项。显然,在空白处的右键菜单上面不应该出现&修改&选项,不然修改的是那一个???
问题的关键就是判定调用右键菜单时,鼠标右击的位置处是不是一个Item。那么实现的代码应该是这样的:
void ListWidget::contextMenuEvent ( QContextMenuEvent * event )
&&& QMenu* popMenu = new QMenu(this);
&&& popMenu-&addAction(new QAction(&添加&, this));
&&& popMenu-&addAction(new QAction(&删除&, this));
&&& if(currentMousePosHasAItem())
&&& &&& popMenu-&addAction(new QAction(&修改&, this));
&&& popMenu-&exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置
如何才能判定鼠标右击时,是否是在一个Item上面呢?可爱的Qt很容易实现。
QListWidgetItem * QListWidget::itemAt ( const QPoint & p ) const
Returns a pointer to the item at the coordinates p.
QListWidgetItem * QListWidget::itemAt ( int x, int y ) const
This is an overloaded member function, provided for convenience.
Returns a pointer to the item at the coordinates (x, y).
以上两个重载的函数,就是如何利用坐标位置获取item,如何返回的NULL, 那么就没有Item。
void ListWidget::contextMenuEvent ( QContextMenuEvent * event )
&&& QMenu* popMenu = new QMenu(this);
&&& popMenu-&addAction(new QAction(&添加&, this));
&&& popMenu-&addAction(new QAction(&删除&, this));
&&& if(this-&itemAt(QCursor::pos()) != NULL) //如果有item则添加&修改&菜单 [1]*
&&& &&& popMenu-&addAction(new QAction(&修改&, this));
&&& popMenu-&exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置
写好上面的代码,咦?还是不行?呵呵,我这里也不行。因为itemAt()中接受的坐标是ListWidget坐标系的。而通过QCursor::pos()获得坐标是全局坐标。需要映射到ListWidget上才可以,Qt Assist中是这样描述的。
QPoint QCursor::pos ()&& [static]
Returns the position of the cursor (hot spot) in global screen coordinates.
You can call QWidget::mapFromGlobal() to translate it to widget coordinates.
See also setPos(), QWidget::mapFromGlobal(), and QWidget::mapToGlobal().
所以最终的代码是:
void ListWidget::contextMenuEvent ( QContextMenuEvent * event )
&&& QMenu* popMenu = new QMenu(this);
&&& popMenu-&addAction(new QAction(&添加&, this));
&&& popMenu-&addAction(new QAction(&删除&, this));
&&& if(this-&itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则添加&修改&菜单 [1]*
&&& &&& popMenu-&addAction(new QAction(&修改&, this));
&&& popMenu-&exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置
OK, 功能实现。记得在自己的代码总要把QAction连接到处理的slot上。上面的代码菜单是没有功能的。
楼主,用下面语句弹出treeitem时会有问题,treeitem节点不对
if(this-&itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则添加&修改&菜单 [1]*
调整为:itemAt(event-&pos())就ok了
event-&pos() 从event获取鼠标相对widget的position&&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23354次
排名:千里之外
原创:15篇
转载:28篇
(2)(3)(5)(8)(2)(5)(1)(5)(1)(3)(5)(3)Qt 学习之路 2(42):QListWidget、QTreeWidget 和 QTableWidget - 推酷
Qt 学习之路 2(42):QListWidget、QTreeWidget 和 QTableWidget
上一章我们了解了 model/view 架构的基本概念。现在我们从最简单的 QListWidget、QTreeWidget 和 QTableWidget 三个类开始了解最简单的 model/view 的使用。这部分内容的确很难组织。首先,从最标准的 model/view 开始,往往会纠结于复杂的代码;但是,如果从简单的&QListWidget、QTreeWidget 和 QTableWidget 开始,由于这三个类都是继承自各自的 view 类,很难避免 model/view 的相关内容。于是,我们这部分的组织是,首先进行简单的数据显示,更复杂的设置则放在后面的章节。
QListWidget
我们要介绍的第一个是 QListWidget。先来看下面的代码示例:
Language:&&C++ (Qt)
label = new QLabel(this);
label-&setFixedWidth(70);
list = new QListWidget(this);
new QListWidgetItem(QIcon(&:/Chrome.png&), tr(&Chrome&), listWidget);
new QListWidgetItem(QIcon(&:/Firefox.png&), tr(&Firefox&), listWidget);
listWidget-&addItem(new QListWidgetItem(QIcon(&:/IE.png&), tr(&IE&)));
listWidget-&addItem(new QListWidgetItem(QIcon(&:/Netscape.png&), tr(&Netscape&)));
listWidget-&addItem(new QListWidgetItem(QIcon(&:/Opera.png&), tr(&Opera&)));
listWidget-&addItem(new QListWidgetItem(QIcon(&:/Safari.png&), tr(&Safari&)));
listWidget-&addItem(new QListWidgetItem(QIcon(&:/TheWorld.png&), tr(&TheWorld&)));
listWidget-&addItem(new QListWidgetItem(QIcon(&:/Traveler.png&), tr(&Traveler&)));
QListWidgetItem *newItem = new QListWidgetItem;
newItem-&setIcon(QIcon(&:/Maxthon.png&));
newItem-&setText(tr(&Maxthon&));
listWidget-&insertItem(3, newItem);
QHBoxLayout *layout = new QHBoxLayout;
layout-&addWidget(label);
layout-&addWidget(list);
setLayout(layout);
connect(list, SIGNAL(currentTextChanged(QString)), label, SLOT(setText(QString)));
QListWidget 是简单的列表组件。当我们不需要复杂的列表时,可以选择 QListWidget。QListWidget 中可以添加 QListWidgetItem 类型作为列表项,QListWidgetItem 即可以有文本,也可以有图标。上面的代码显示了三种向列表中添加列表项的方法(实际是两种,后两种其实是一样的),我们的列表组件是 listWidget,那么,向 listWidget 添加列表项可以:第一,使用下面的语句
Language:&&C++ (Qt)
new QListWidgetItem(QIcon(&:/Chrome.png&), tr(&Chrome&), listWidget);
第二,使用
Language:&&C++ (Qt)
listWidget-&addItem(new QListWidgetItem(QIcon(&:/IE.png&), tr(&IE&)));
QListWidgetItem *newItem = new QListWidgetItem;
newItem-&setIcon(QIcon(&:/Maxthon.png&));
newItem-&setText(tr(&Maxthon&));
listWidget-&insertItem(3, newItem);
注意这两种添加方式的区别:第一种需要在构造时设置所要添加到的 QListWidget 对象;第二种方法不需要这样设置,而是要调用 addItem() 或者 insertItem() 自行添加。如果你仔细查阅 QListWidgetItem 的构造函数,会发现有一个默认的 type 参数。该参数有两个合法值:QListWidgetItem::Type(默认)和 QListWidgetItem::UserType。如果我们继承 QListWidgetItem,可以设置该参数,作为我们子类的一种区别,以便能够在 QListWidget 区别处理不同子类。
我们的程序的运行结果如下:
我们可以利用 QListWidget 发出的各种信号来判断是哪个列表项被选择,具体细节可以参考文档。另外,我们也可以改变列表的显示方式。前面的列表是小图标显示,我们也可以更改为图标显示,只要添加一行语句:
Language:&&C++ (Qt)
listWidget-&setViewMode(QListView::IconMode);
结果如下:
QTreeWidget
我们要介绍的第二个组件是 QTreeWidget。顾名思义,这是用来展示树型结构(也就是层次结构)的。同前面说的 QListWidget 类似,这个类需要同另外一个辅助类 QTreeWidgetItem 一起使用。不过,既然是提供方面的封装类,即便是看上去很复杂的树,在使用这个类的时候也是显得比较简单的。当不需要使用复杂的 QTreeView 特性的时候,我们可以直接使用 QTreeWidget 代替。
下面我们使用代码构造一棵树:
Language:&&C++ (Qt)
QTreeWidget treeWidget;
treeWidget.setColumnCount(1);
QTreeWidgetItem *root = new QTreeWidgetItem(&treeWidget, QStringList(QString(&Root&)));
new QTreeWidgetItem(root, QStringList(QString(&Leaf 1&)));
QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root, QStringList(QString(&Leaf 2&)));
leaf2-&setCheckState(0, Qt::Checked);
QList&QTreeWidgetItem *& rootList;
rootList && root;
treeWidget.insertTopLevelItems(0, rootList);
treeWidget.show();
首先,我们创建了一个 QTreeWidget 实例。然后我们调用 setColumnCount() 函数设定栏数。这个函数的效果我们会在下文了解到。最后,我们向 QTreeWidget 添加 QTreeWidgetItem。QTreeWidgetItem 有很多重载的构造函数。我们在这里看看其中的一个,其余的请自行查阅文档。这个构造函数的签名如下:
Language:&&C++ (Qt)
QTreeWidgetItem(QTreeWidget *parent, const QStringList &strings, int type = Type);
这里有 3 个参数,第一个参数用于指定这个项属于哪一个树,类似前面的 QListWidgetItem,如果指定了这个值,则意味着该项被直接添加到树中;第二个参数指定显示的文字;第三个参数指定其类型,同 QListWidgetItem 的 type 参数十分类似。值得注意的是,第二个参数是 QStringList 类型的,而不是 QString 类型。我们会在下文了解其含义。
在这段代码中,我们创建了作为根的 QTreeWidgetItem root。然后添加了第一个叶节点,之后又添加一个,而这个则设置了可选标记。最后,我们将这个 root 添加到一个 QTreeWidgetItem 的列表,作为 QTreeWidget 的数据项。此时你应该想到,既然 QTreeWidget 接受 QList 作为项的数据,它就能够支持多棵树的一起显示,而不仅仅是单根树。下面我们来看看运行结果:
从代码来看,我们能够想象到这个样子,只是这个树的头上怎么会有一个 1?还记得我们跳过去的那个函数吗?下面我们修改一下代码看看:
Language:&&C++ (Qt)
QTreeWidget treeWidget;
QStringList headers;
headers && &Name& && &Number&;
treeWidget.setHeaderLabels(headers);
QStringList rootTextList;
rootTextList && &Root& && &0&;
QTreeWidgetItem *root = new QTreeWidgetItem(&treeWidget, rootTextList);
new QTreeWidgetItem(root, QStringList() && QString(&Leaf 1&) && &1&);
QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root,
QStringList() && QString(&Leaf 2&) && &2&);
leaf2-&setCheckState(0, Qt::Checked);
QList&QTreeWidgetItem *& rootList;
rootList && root;
treeWidget.insertTopLevelItems(0, rootList);
treeWidget.show();
这次我们没有使用 setColumnCount(),而是直接使用 QStringList 设置了 headers,也就是树的表头。接下来我们使用的还是 QStringList 设置数据。这样,我们实现的是带有层次结构的树状表格。利用这一属性,我们可以比较简单地实现类似 Windows 资源管理器的界面。
如果你不需要显示这个表头,可以调用 setHeaderHidden() 函数将其隐藏。
QTableWidget
我们要介绍的最后一个是&QTableWidget。QTableWidget 并不比前面的两个复杂到哪里去,这点我们可以从代码看出来:
Language:&&C++ (Qt)
QTableWidget tableWidget;
tableWidget.setColumnCount(3);
tableWidget.setRowCount(5);
QStringList headers;
headers && &ID& && &Name& && &Age& && &Sex&;
tableWidget.setHorizontalHeaderLabels(headers);
tableWidget.setItem(0, 0, new QTableWidgetItem(QString(&0001&)));
tableWidget.setItem(1, 0, new QTableWidgetItem(QString(&0002&)));
tableWidget.setItem(2, 0, new QTableWidgetItem(QString(&0003&)));
tableWidget.setItem(3, 0, new QTableWidgetItem(QString(&0004&)));
tableWidget.setItem(4, 0, new QTableWidgetItem(QString(&0005&)));
tableWidget.setItem(0, 1, new QTableWidgetItem(QString(&&)));
tableWidget.show();
这段代码运行起来是这样子的:
首先我们创建了 QTableWidget 对象,然后设置列数和行数。接下来使用一个 QStringList,设置每一列的标题。我们可以通过调用 setItem() 函数来设置表格的单元格的数据。这个函数前两个参数分别是行索引和列索引,这两个值都是从 0 开始的,第三个参数则是一个 QTableWidgetItem 对象。Qt 会将这个对象放在第 row 行第 col 列的单元格中。有关 QTableWidgetItem 的介绍完全可以参见上面的 QListWidgetItem 和 QTreeWidgetItem。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示

我要回帖

更多关于 qlistwidget样式 的文章

 

随机推荐