【QT】多元素控件

发布于:2024-07-03 ⋅ 阅读:(13) ⋅ 点赞:(0)

目录

概述 

List Widget

核心属性 

核心方法

核心信号

QListWidgetItem核心方法

Table Widget

核心方法

QTableWidgetItem 核心信号

QTableWidgetItem 核心方法

使用示例:

Tree Widget 

核心方法

核心信号

QTreeWidgetItem核心属性

QTreeWidgetItem核心方法

使用示例:


概述 

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);
    }