目录
概述
Qt 中提供的多元素控件有:
- QListWidget
- QListView
- QTableWidget
- QTableView
- QTreeWidget
- QTreeView
xxWidget 和 xxView 之间的区别:以 QTableWidget 和 QTableView 为例。
- QTableView 是基于 MVC 设计的控件. QTableView ⾃⾝不持有数据. 使⽤ QTableView 的时候需要⽤⼾创建⼀个 Model 对象 (⽐如 QStandardModel ), 并且把 Model 和QTableView 关联起来. 后续修改 Model 中的数据就会影响 QTableView 的显⽰; 修改QTableView 的显⽰也会影响到 Model 中的数据(双向绑定).
- QTableWidget 则是 QTableView 的⼦类, 对 Model 进⾏了封装. 不需要⽤⼾⼿动创建Model 对象, 直接就可以往 QTableWidget 中添加数据了. 也就是说 xxxwidget是基于xxView同时把model和controller都帮我们实现好了。
List Widget
使⽤
QListWidget
能够显⽰⼀个纵向的列表. 形如:
每个选项都可以选中
核心属性
属性 | 说明 |
---|---|
currentRow
|
当前被选中的是第⼏⾏
|
count
|
⼀共有多少⾏
|
sortingEnabled
|
是否允许排序
|
isWrapping
|
是否允许换⾏
|
itemAlignment
|
元素的对⻬⽅式
|
selectRectVisible
|
被选中的元素矩形是否可⻅
|
spacing
|
元素之间的间隔
|
核心方法
方法 | 说明 |
---|---|
addItem(const QString& label)
addItem(QListWidgetItem *
item)
|
列表中添加元素
|
currentItem()
|
返回 QListWidgetItem* 表⽰当前选中的元素
|
setCurrentItem(QListWidgetItem* item)
|
设置选中哪个元素
|
setCurrentRow(int row)
|
设置选中第⼏⾏的元素
|
insertItem(const QString& label, int row)
insertItem(QListWidgetItem *
item, int
row)
|
在指定的位置插⼊元素
|
item(int row)
|
返回 QListWidgetItem* 表⽰第 row ⾏的元素
|
takeItem(int row)
|
删除指定⾏的元素, 返回 QListWidgetItem* 表⽰是哪个元素被删除了
|
核心信号
方法 | 说明 |
---|---|
currentItemChanged(QListWidgetItem* current, QListWidgetItem* old)
|
选中不同元素时会触发. 参数是当前选中的元素和之前选中的元素.
|
currentRowChanged(int)
|
选中不同元素时会触发. 参数是当前选中元素的⾏数.
|
itemClicked(QListWidgetItem* item)
|
点击某个元素时触发
|
itemDoubleClicked(QListWidgetItem* item)
|
双击某个元素时触发
|
itemEntered(QListWidgetItem* item)
|
⿏标进⼊元素时触发
|
在上述介绍中,涉及到一个关键的类QListWidgetItem。
这个类表示QListWidget的一个元素。
QListWidgetItem核心方法
方法 | 说明 |
---|---|
setFont
|
设置字体
|
setIcon
|
设置图标
|
setHidden
|
设置隐藏
|
setSizeHint
|
设置尺⼨
|
setSelected
|
设置是否选中
|
setText
|
设置⽂本
|
setTextAlignment
|
设置⽂本对⻬⽅式
|
Table Widget
使⽤
QTableWidget
表⽰⼀个表格控件. ⼀个表格中包含若⼲⾏, 每⼀⾏⼜包含若⼲列.
表格中的每个单元格, 是⼀个
QTableWidgetItem
对象.
核心方法
方法 | 说明 |
---|---|
item(int row, int column)
|
根据⾏数列数获取指定的
QTableWidgetItem*
|
setItem(int row, int column, QTableWidget*)
|
根据⾏数列数设置表格中的元素
|
currentItem()
|
返回被选中的元素 QTableWidgetItem*
|
currentRow()
|
返回被选中元素是第⼏⾏
|
currentColumn()
|
返回被选中元素是第⼏列
|
row(QTableWidgetItem* )
|
获取指定 item 是第⼏⾏
|
column(QTableWidgetItem* )
|
获取指定 item 是第⼏列
|
rowCount()
|
获取⾏数
|
columnCount()
|
获取列数
|
insertRow(int row)
|
在第 row ⾏处插⼊新⾏
|
insertColumn(int column)
|
在第 column 列插⼊新列
|
removeRow(int row)
|
删除第 row ⾏
|
removeColumn(int column)
|
删除第 column 列
|
setHorizontalHeaderItem(int column, QTableWidget*)
|
设置指定列的表头
|
setVerticalHeaderItem(int row,
QTableWidget*)
|
设置指定⾏的表头
|
上述涉及的 QTableWidgetItem有关的信号和方法如下:
QTableWidgetItem 核心信号
信号 | 说明 |
---|---|
cellClicked(int row, int column)
|
点击单元格时触发
|
cellDoubleClicked(int row, int column)
|
双击单元格时触发
|
cellEntered(int row, int column)
|
⿏标进⼊单元格时触发
|
currentCellChanged(int row, int column, int previousRow, int previousColumn)
|
选中不同单元格时触发
|
QTableWidgetItem 核心方法
方法 | 说明 |
---|---|
row()
|
获取当前是第⼏⾏
|
column()
|
获取当前是第⼏列
|
setText(const QString&)
|
设置⽂本
|
setTextAlignment(int)
|
设置⽂本对⻬
|
setIcon(const QIcon&)
|
设置图标
|
setSelected(bool)
|
设置被选中
|
setSizeHints(const QSize&)
|
设置尺⼨
|
setFont(const QFont&)
|
设置字体
|
使用示例:
1. 创建3行
ui->tableWidget->insertRow(0);
ui->tableWidget->insertRow(1);
ui->tableWidget->insertRow(2);
2. 创建3列
ui->tableWidget->insertColumn(0);
ui->tableWidget->insertColumn(1);
ui->tableWidget->insertColumn(2);
3. 给每一列设置列名(行名也类似)
ui->tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem("学号"));
ui->tableWidget->setHorizontalHeaderItem(1,new QTableWidgetItem("姓名"));
ui->tableWidget->setHorizontalHeaderItem(2,new QTableWidgetItem("年龄"));
4. 给表格添加数据
ui->tableWidget->setItem(0,0,new QTableWidgetItem("1007"));
ui->tableWidget->setItem(0,1,new QTableWidgetItem("lzb"));
ui->tableWidget->setItem(0,2,new QTableWidgetItem("20"));
效果如下:
Tree Widget
使⽤ QTreeWidget
表⽰⼀个树形控件. ⾥⾯的每个元素, 都是⼀个
QTreeWidgetItem
, 每个
QTreeWidgetItem
可以包含多个⽂本和图标, 每个⽂本/图标为⼀个列.
可以给 QTreeWidget
设置顶层节点(顶层节点可以有多个), 然后再给顶层节点添加⼦节点, 从⽽构成树形结构.
核心方法
方法 | 说明 |
---|---|
clear
|
清空所有⼦节点
|
addTopLevelItem(QTreeWidgetItem* item)
|
新增顶层节点
|
topLevelItem(int index)
|
获取指定下标的顶层节点.
|
topLevelItemCount()
|
获取顶层节点个数
|
indexOfTopLevelItem(QTreeWidgetItem* item)
|
查询指定节点是顶层节点中的下标
|
takeTopLevelItem(int index)
|
删除指定的顶层节点. 返回 QTreeWidgetItem* 表⽰被删除
的元素
|
currentItem()
|
获取到当前选中的节点, 返回 QTreeWidgetItem*
|
setCurrentItem(QTreeWidgetItem* item)
|
选中指定节点
|
setExpanded(bool)
|
展开/关闭节点
|
setHeaderLabel(const QString& text)
|
设置 TreeWidget 的 header 名称
|
核心信号
信号 | 说明 |
---|---|
currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* old)
|
切换选中元素时触发
|
itemClicked(QTreeWidgetItem* item, int col)
|
点击元素时触发
|
itemDoubleClicked(QTreeWidgetItem* item,
int col)
|
双击元素时触发
|
itemEntered(QTreeWidgetItem* item, int col)
|
⿏标进⼊时触发
|
itemExpanded(QTreeWidgetItem* item)
|
元素被展开时触发
|
itemCollapsend(QTreeWidgetItem* item)
|
元素被折叠时触发
|
上述涉及到的QTreeWidgetItem核心方法和属性如下
QTreeWidgetItem核心属性
属性 | 说明 |
---|---|
text
|
持有的⽂本
|
textAlignment
|
⽂本对⻬⽅式
|
icon
|
持有的图表
|
font
|
⽂本字体
|
hidden
|
是否隐藏
|
disabled
|
是否禁⽤
|
expand
|
是否展开
|
sizeHint
|
尺⼨⼤⼩
|
selected
|
是否选中
|
QTreeWidgetItem核心方法
方法 | 说明 |
---|---|
addChild(QTreeWidgetItem* child)
|
新增⼦节点
|
childCount()
|
⼦节点的个数
|
child(int index)
|
获取指定下标的⼦节点. 返回 QTreeWidgetItem*
|
takeChild(int index)
|
删除对应下标的⼦节点
|
removeChild(QTreeWidgetItem* child)
|
删除对应的⼦节点
|
parent()
|
获取该元素的⽗节点
|
使用示例:
1. 设置根节点名字
ui->treeWidget->setHeaderLabel("动物");
2. 新增顶层节点
//新建两个节点
QTreeWidgetItem* item1 = new QTreeWidgetItem();
item1->setText(0,"猫");
QTreeWidgetItem* item2 = new QTreeWidgetItem();
item2->setText(0,"狗");
//将这两个节点添加为顶层节点
ui->treeWidget->addTopLevelItem(item1);
ui->treeWidget->addTopLevelItem(item2);
3. 顶层节点添加子节点
QTreeWidgetItem* item3 = new QTreeWidgetItem();
item3->setText(0,"布偶猫");
item1->addChild(item3);
4. 删除选中元素
//获取到选中的元素
QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
if(currentItem == nullptr)
{
return;
}
//删除选中的元素,需要先获取到父元素,通过父元素进行删除
QTreeWidgetItem* parent = currentItem->parent();
if(parent == nullptr)
{
//顶层元素
int index = ui->treeWidget->indexOfTopLevelItem(currentItem);
ui->treeWidget->takeTopLevelItem(index);
}
else{
//普通元素
parent->removeChild(currentItem);
}