Qt 学习之路 2(42):QListWidget、QTreeWidget 和 QTableWidget
2013-08-07 22:29
453 查看
Qt 学习之路 2(42):QListWidget、QTreeWidget 和 QTableWidget
作者: 豆子 日期:2013 年 02 月 05 日发表评论 (9)查看评论
上一章我们了解了 model/view 架构的基本概念。现在我们从最简单的 QListWidget、QTreeWidget 和 QTableWidget 三个类开始了解最简单的 model/view 的使用。这部分内容的确很难组织。首先,从最标准的 model/view 开始,往往会纠结于复杂的代码;但是,如果从简单的 QListWidget、QTreeWidget 和 QTableWidget 开始,由于这三个类都是继承自各自的 view 类,很难避免 model/view 的相关内容。于是,我们这部分的组织是,首先进行简单的数据显示,更复杂的设置则放在后面的章节。
QListWidget
我们要介绍的第一个是 QListWidget。先来看下面的代码示例:Language: C++ (Qt) | |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | label = new QLabel(this); label->setFixedWidth(70); listWidget = 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(listWidget); setLayout(layout); connect(listWidget, SIGNAL(currentTextChanged(QString)), label, SLOT(setText(QString))); |
Language: C++ (Qt) | |
0 | new QListWidgetItem(QIcon(":/Chrome.png"), tr("Chrome"), listWidget); |
Language: C++ (Qt) | |
01 | 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); |
区别处理不同子类。
我们的程序的运行结果如下:
![](http://images.devbean.net/2013/01/listwidget-demo.png)
我们可以利用 QListWidget 发出的各种信号来判断是哪个列表项被选择,具体细节可以参考文档。另外,我们也可以改变列表的显示方式。前面的列表是小图标显示,我们也可以更改为图标显示,只要添加一行语句:
Language: C++ (Qt) | |
0 | listWidget->setViewMode(QListView::IconMode); |
![](http://images.devbean.net/2013/01/listwidget-icon-mode-demo.png)
QTreeWidget
我们要介绍的第二个组件是 QTreeWidget。顾名思义,这是用来展示树型结构(也就是层次结构)的。同前面说的 QListWidget 类似,这个类需要同另外一个辅助类 QTreeWidgetItem 一起使用。不过,既然是提供方面的封装类,即便是看上去很复杂的树,在使用这个类的时候也是显得比较简单的。当不需要使用复杂的 QTreeView 特性的时候,我们可以直接使用 QTreeWidget 代替。下面我们使用代码构造一棵树:
Language: C++ (Qt) | |
01 | 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(); |
Language: C++ (Qt) | |
0 | QTreeWidgetItem(QTreeWidget *parent, const QStringList &strings, int type = Type); |
在这段代码中,我们创建了作为根的 QTreeWidgetItem root。然后添加了第一个叶节点,之后又添加一个,而这个则设置了可选标记。最后,我们将这个 root 添加到一个 QTreeWidgetItem 的列表,作为 QTreeWidget 的数据项。此时你应该想到,既然 QTreeWidget 接受 QList 作为项的数据,它就能够支持多棵树的一起显示,而不仅仅是单根树。下面我们来看看运行结果:
![](http://images.devbean.net/2013/01/treewidget-demo.png)
从代码来看,我们能够想象到这个样子,只是这个树的头上怎么会有一个 1?还记得我们跳过去的那个函数吗?下面我们修改一下代码看看:
Language: C++ (Qt) | |
01 | 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(); |
![](http://images.devbean.net/2013/02/treewidget-demo-2.png)
如果你不需要显示这个表头,可以调用 setHeaderHidden() 函数将其隐藏。
QTableWidget
我们要介绍的最后一个是 QTableWidget。QTableWidget 并不比前面的两个复杂到哪里去,这点我们可以从代码看出来:Language: C++ (Qt) | |
01 | 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("20100112"))); tableWidget.show(); |
![](http://images.devbean.net/2013/02/tablewidget-demo.png)
首先我们创建了 QTableWidget 对象,然后设置列数和行数。接下来使用一个 QStringList,设置每一列的标题。我们可以通过调用 setItem() 函数来设置表格的单元格的数据。这个函数前两个参数分别是行索引和列索引,这两个值都是从 0 开始的,第三个参数则是一个 QTableWidgetItem 对象。Qt 会将这个对象放在第 row 行第 col 列的单元格中。有关 QTableWidgetItem 的介绍完全可以参见上面的 QListWidgetItem 和 QTreeWidgetItem。
相关文章推荐
- Qt 学习之路 2(42):QListWidget、QTreeWidget 和 QTableWidget
- Qt 学习之路 2(42):QListWidget、QTreeWidget 和 QTableWidget
- Qt学习: QListWidget的用法.
- Qt学习之路_9(Qt中Item Widget初步探索)
- Qt学习之QListWidget删除Item
- Qt学习之解决QListWidgetItem有重叠时,点一下全部选中的问题
- Qt学习:项视图类之QListWidget
- Qt学习之路_9(Qt中Item Widget初步探索)
- QListWidget、QTreeWidget 和 QTableWidget
- Qt学习笔记-----QListWidget,QTableWidget和QTreeWidget
- Qt学习: QListWidget程序示例
- Qt学习:项视图类之QListWidget
- Qt程序学习(三)------QTreeWidget、右键菜单、动态改变comboBox、QTreeWidgetItem的对应列的文字编辑
- Qt 学习之路 2(85):动态视图
- Qt 学习之路2(46)视图和委托---代码实现
- [记录]<<QT学习之路2>>学习第三天
- Qt学习笔记--窗口部件(Widget)
- QT的学习之路 Ui 头文件研究
- Qt学习之路之ODBC访问SQLserver数据库
- QT学习之路————QT程序在开发板上旋转