项目控件组(基于项)Item-Based
控件组
(1)List Widget:清单控件
QListWidget
-
控件简介
-
继承关系:继承自 QListView
-
功能:提供一个基于项的列表小部件,允许添加和删除项目,使用内部模型管理 QListWidgetItem
-
特点:相比于 QListView,QListWidget 操作更为便捷,不需要用户自行建模,直接使用 addItem 添加项目
-
-
用法示例
-
示例说明
-
创建用户界面组件
-
使用 QListWidget 组件来显示音乐文件列表
-
添加一个按钮用于触发文件选择操作
-
-
当用户单击按钮时,程序会调用系统的文件打开窗口
-
在打开文件选择框时,设置文件过滤器,只显示以 .mp3 结尾的文件
-
创建示例 mp3 文件
-
使用 touch 命令在终端创建两个示例文件:0.mp3 和 1.mp3
-
这两个文件仅作为示例,不是实际的音乐文件
-
-
当用户在文件选择框中选择这两个 mp3 文件后,程序将这些文件路径添加为 QListWidget 的项
-
此操作是实现音乐播放器功能中的一个部分,实际应用中用户需要打开和选择音乐文件
-
具体实现时需要编写相应的信号槽机制,连接按钮的点击事件与文件选择功能
-
-
代码
-
在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6 #include
7
8 class MainWindow : public QMainWindow
9{
10 Q_OBJECT
11
12 public:
13 MainWindow(QWidget parent = nullptr);
14 ~MainWindow();
15
16 private:
17 / 声明对象 */
18 QListWidget *listWidget;
19 QPushButton *pushButton;
20
21 private slots:
22 void pushButtonClicked();
23
24 };
25 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2 #include “QFileDialog”
3
4 MainWindow::MainWindow(QWidget parent)
5 : QMainWindow(parent)
6{
7 / 设置主窗口的显示位置与大小 /
8 this->setGeometry(0, 0, 800, 480);
9
10 listWidget = new QListWidget(this);
11
12 / 设置 listWidget 的大小 /
13 listWidget->setGeometry(0, 0, 480, 480);
14
15 listWidget->addItem(“请单击右边的添加项添加内容”);
16
17 pushButton = new QPushButton(this);
18
19 / 设置 pushButton 的位置与大小 /
20 pushButton->setGeometry(540, 200, 200, 100);
21 pushButton->setText(“添加项”);
22
23 / 信号与槽连接 /
24 connect(pushButton, SIGNAL(clicked()),
25 this, SLOT(pushButtonClicked()));
26 }
27
28 void MainWindow::pushButtonClicked()
29 {
30 / 调用系统打开文件窗口,设置窗口标题为“打开文件”,过滤文件名 /
31 QString fileName = QFileDialog::getOpenFileName(
32 this,tr(“添加项”),“”,
33 tr("Files(.mp3)")
34 );
35
36 /* 判断是否选中打开 mp3 文件 /
37 if (fileName != NULL)
38 / 添加项到列表中 */
39 listWidget->addItem(fileName);
40 }
41
42 MainWindow::~MainWindow()
43 {
44 }
- 1 #include “mainwindow.h”
-
main.cpp
- 1 #include “mainwindow.h”
2
3 #include
4
5 int main(int argc, char *argv[])
6{
7 QApplication a(argc, argv);
8 MainWindow w;
9 w.show();
10 return a.exec();
11 }
- 1 #include “mainwindow.h”
-
-
运行效果
-
当点击添加项按钮时出现系统选择文件的对话框,系统打开文件时会过滤 mp3 后缀的文件,点击后缀为 mp3 的文件,双击或者选择后再点击右上角的“Open”的打开来把这个文件添加到左边的 QListWidget 列表中
-
-
(2)TreeWidget:树形控件
QTreeWidget
-
控件简介
-
继承关系:继承自 QTreeView
-
功能:提供一个使用预定义树模型的树视图,方便管理和显示树状结构的数据
-
特点:基于项的经典接口,每个项为 QTreeWidgetItem,不需要用户自定义模型,直接使用内置的树模型
-
-
用法示例
-
使用一个 TreeWidget,模拟成一个飞信联系人分组,通过选中组内联系人来“群发”信息
-
思路:当选中顶层的树形节点时,子节点全部被选中;当取消选择顶层树形节点时,子节点原来选中的状态将全部取消;当不完全选中子节时,树节点显示为半选状态
-
在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6 #include
7
8 class MainWindow : public QMainWindow
9{
10 Q_OBJECT
11
12 public:
13 MainWindow(QWidget parent = nullptr);
14 ~MainWindow();
15
16 private:
17 / QTreeWidget 对象 */
18 QTreeWidget treeWidget;
19 / 顶层树节点 */
20 QTreeWidgetItem parentItem;
21 / 声明三个子节点 /
22 QTreeWidgetItem subItem[3];
23
24 / 子节点处理函数 /
25 void updateParentItem(QTreeWidgetItem);
26
27 private slots:
28 / 槽函数 /
29 void treeItemChanged(QTreeWidgetItem, int);
30
31 };
32 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2
3 MainWindow::MainWindow(QWidget parent)
4 : QMainWindow(parent)
5{
6 / 设置主窗体大小 /
7 this->setGeometry(0, 0, 800, 480);
8
9 / 实例化 /
10 treeWidget = new QTreeWidget(this);
11
12 / 居中 /
13 setCentralWidget(treeWidget);
14
15 / 清空列表 /
16 treeWidget->clear();
17
18 / 实例化顶层树节点 /
19 parentItem = new QTreeWidgetItem(treeWidget);
20 parentItem->setText(0, “同事”);
21
22 parentItem->setFlags(
23 Qt::ItemIsUserCheckable
24 | Qt::ItemIsEnabled
25 | Qt::ItemIsSelectable
26 );
27 / 树节点设置为未选中 /
28 parentItem->setCheckState(0, Qt::Unchecked);
29
30 / 字符串链表 /
31 QList strList;
32 strList<<“关羽”<<“刘备”<<“张飞”;
33
34 for (int i = 0; i < 3; i++){
35 / 实例化子节点 /
36 subItem[i] = new QTreeWidgetItem(parentItem);
37 / 设置子节点的文本,参数 0 代表第 0 列 /
38 subItem[i]->setText(0, strList[i]);
39 / 设置子节点的属性为用户可选、项开启、项可选 /
40 subItem[i]->setFlags(
41 Qt::ItemIsUserCheckable
42 | Qt::ItemIsEnabled
43 | Qt::ItemIsSelectable
44 );
45 / 设置子节点的状态为未选中 /
46 subItem[i]->setCheckState(0,Qt::Unchecked);
47 }
48 / 信号槽连接 /
49 connect(treeWidget,SIGNAL(itemChanged(QTreeWidgetItem , int)),
50 this, SLOT(treeItemChanged(QTreeWidgetItem* , int)));
51
52 }
53
54 /* 更新树节点函数 /
55 void MainWindow::updateParentItem(QTreeWidgetItem item)
56 {
57 / 获取子节点的父节点(树节点) /
58 QTreeWidgetItem parent = item->parent();
59 if(parent == NULL){
60 return;
61 }
62 / 初始化选中的数目为 0,下面根据 selectCount 来判断树节点的状态 /
63 int selectCount = 0;
64 / 获取树节点的子节点总数 /
65 int childCount = parent->childCount();
66 / 循环判断子节点的状态 /
67 for(int i = 0; i < childCount; i ++){
68 QTreeWidgetItem childItem =parent->child(i);
69 /* 判断当前子节点的状是否为选中状态,如果是,则加一 /
70 if(childItem->checkState(0) == Qt::Checked) {
71 selectCount ++;
72 }
73 }
74 / 根据 selectCount 来判断树节点的状态 /
75 / 当选中的子节点小于或等于 0 时,则为设置树节点为未选中状态 /
76 if (selectCount <= 0) {
77 / 设置树节点为未选中状态 /
78 parent->setCheckState(0, Qt::Unchecked);
79 / 部分选中时,树节点为半选状态 /
80 } else if (selectCount > 0 && selectCount < childCount) {
81 / 设置为半选状态 /
82 parent->setCheckState(0, Qt::PartiallyChecked);
83 / 子节点全选时 /
84 } else if (selectCount == childCount){
85 / 设置为树节点为选中状态 */
86 parent->setCheckState(0, Qt::Checked);
87 }
88 }
89
90 void MainWindow::treeItemChanged(QTreeWidgetItem item, int)
91 {
92 / 获取子节点总数 /
93 int count = item->childCount();
94
95 / 若顶层树节点选中 /
96 if(Qt::Checked == item->checkState(0) ) {
97 / 若选中的项是树节点,count 会大于 0,否则选中的项是子节点 /
98 if (count > 0) {
99 for (int i = 0; i < count; i++) {
100 / 子节点全选 /
101 item->child(i)->setCheckState(0, Qt::Checked);
102 }
103 } else {
104 / 子节点处理 /
105 updateParentItem(item);
106 }
107 / 若顶层树节点取消选中时 /
108 } else if (Qt::Unchecked == item->checkState(0)) {
109 if (count > 0){
110 / 若选中的项是树节点,count 会大于 0,否则选中的项是子节点 /
111 for (int i = 0; i < count; i++) {
112 / 子节点全不选 /
113 item->child(i)->setCheckState(0, Qt::Unchecked);
114 }
115 } else {
116 / 子节点处理 */
117 updateParentItem(item);
118 }
119 }
120 }
121
122 MainWindow::~MainWindow()
123 {
124 }
- 1 #include “mainwindow.h”
-
main.cpp
- 由新建项目时生成,无改动
-
-
运行效果
- 全选时的状态
(3)Table Widget:表控件
QTableWidget
-
控件简介
-
继承关系:继承自 QTableView
-
功能:提供一个带有默认模型的基于项的表视图,用于显示和管理表格数据
-
特点:使用 QTableWidgetItem 管理表格中的项,简化了表格数据的管理操作,用户无需自行创建模型
-
-
用法示例
-
使用一个 TableWidget,绘制一
个表格,同时修改项的标题,在表格里可以直接通过双击进行编辑项里的内容,也可以删除项里的内容等 -
在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6
7 class MainWindow : public QMainWindow
8{
9 Q_OBJECT
10
11 public:
12 MainWindow(QWidget parent = nullptr);
13 ~MainWindow();
14
15 private:
16 / QTabelWidget 表格 */
17 QTableWidget tableWidget;
18
19 / QTabelWidgetItem 表格数据(项) */
20 QTableWidgetItem *tableWidgetItem[4];
21
22 };
23 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2
3 MainWindow::MainWindow(QWidget parent)
4 : QMainWindow(parent)
5{
6 / 设置主窗体的大小与位置 /
7 this->setGeometry(0, 0, 800, 480);
8
9 / 实例化 /
10 tableWidget = new QTableWidget(this);
11 / 设置 tableWidget 表居中 /
12 setCentralWidget(tableWidget);
13 / 设置列数 /
14 tableWidget->setColumnCount(2);
15 / 设置行数 /
16 tableWidget->setRowCount(2);
17 / 使用标签设置水平标题标签 /
18 tableWidget->setHorizontalHeaderLabels(
19 QStringList()<<“姓名”<<“性别”
20 );
21
22 / 字符串类型链表 /
23 QList strList;
24 strList<<“小明”<<“小红”<<“男”<<“女”;
25
26 for (int i = 0; i < 4; i++) {
27 / 实例化 /
28 tableWidgetItem[i] = new QTableWidgetItem(strList[i]);
29 / 设置文本居中对齐 /
30 tableWidgetItem[i]->setTextAlignment(Qt::AlignCenter);
31 }
32 / 插入数据,表的 index 就是一个二维数组数据 */
33 tableWidget->setItem(0, 0, tableWidgetItem[0]);
34 tableWidget->setItem(1, 0, tableWidgetItem[1]);
35 tableWidget->setItem(0, 1, tableWidgetItem[2]);
36 tableWidget->setItem(1, 1, tableWidgetItem[3]);
37
38 }
39
40 MainWindow::~MainWindow()
41 {
42 }
- 1 #include “mainwindow.h”
-
main.cpp
- 由新建项目时生成,无改动
-
-
运行效果
- 双击表格中的项,可修改表格的内容,同时也可以删除内容