目录
- 一、概述
- 二、QListWidget
- 三、QTableWidget
- 四、QTreeWidget
一、概述
Qt中提供的多元素控件有:
- QListWidget
- QListView
- QTableWidget
- QTableView
- QTreeWidget
- QTreeView
xxWidget 和 xxView 的区别 以 QTableView 和 QTableView 为例 QTableView 是基于 MVC
设计的控件,QTableView 自身不持有数据。使用QTableView 的时候需要用户创建一个 Model 对象(比如QStandardModel),并且把Model 和 QTableView 关联起来。后续修改 Model 中的数据就会影响
QTableView 的显示;修改 QTableView 中的显示也会影响到 Model 中的数据 (双向绑定) QTableWidget则是QTableView 的子类,对Model 进行封装。不需要用户手动创建 Model 对象,直接就可以往 QTableWidget中添加数据了。
二、QListWidget
QListWidget是一个纵向的列表
属性 | 说明 |
---|---|
currentRow | 当前被选中的行号 |
count | 一共有多少行 |
sortingEnabled | 是否允许排序 |
isWrapping | 是否允许换行 |
itmeAlignment | 元素的对齐方式 |
selectRectVisible | 被选中的元素矩形是否课可见 |
spacing | 元素之间的间隔 |
additem(const QString&) addItem(QListWidgetItem*) | 列表中添加元素 |
currentItem | 返回QListWidgetItem*当前选中的元素 |
setCurrentItem(QListWidgetItem*) | 设置选中的元素 |
setCurrentRow(int) | 设置选中第几行的元素 |
insertItem(const QString&,int row) insertItem(QListWidgetItem* item,int row) | 指定位置插入元素 |
item(int row) | 返回QItemWidgetItem*表示第row行的元素 |
takeItem(int row) | 删除指定行的元素,返回QListWidgetItem* 表示哪个元素被删除 |
信号
属性 | 说明 |
---|---|
currentltemChanged(OListWidgetltem* current,OListWidgetltem*old) | 选中不同元素时会触发.参数是当前选中的元素和之前选中的元素 |
currentRowChanged(int) | 选中不同元素时会触发.参数是当前选中元素的行数 |
itemClicked(QListWidgetltem* item) | 点击某个元素时触发 |
itemDoubleClicked(QListWidgetltem* item) | 双击某个元素时触发 |
itemEntered(QListWidgetltem* item) | 鼠标进入元素时触发 |
QListWidgetItem。这个类表示 QListWidget 中的一个元素。核心方法如下:本质就是一个 “文本” + “图标” 组成的
属性 | 说明 |
---|---|
setFont | 设置字体 |
setIcon | 设置图标 |
setHidden | 设置隐藏 |
setSizeHint | 设置尺寸 |
setSelected | 是否选中 |
setText | 设置文本 |
setTextAlignment | 设置文本对齐方式 |
实例
实现一个可以增加删除的ListWidget
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->listWidget->addItem("Cpp");
ui->listWidget->addItem("rust");
ui->listWidget->addItem("C#");
ui->listWidget->addItem("java");
}
Widget::~Widget()
{
delete ui;
}
//点击添加按钮将数据添加到listwidget中
void Widget::on_pushButton_insert_clicked()
{
//获取当前输入行中内容
const QString str = ui->lineEdit->text();
//将获取的内容添加到listwidget中
ui->listWidget->addItem(str);
}
//点击删除按钮将listwidget中指定数据删除
void Widget::on_pushButton_delete_clicked()
{
//获取当前被选中数据的位置
int pos = ui->listWidget->currentRow();
if(pos<0)
{
//没有指定的情况
return;
}
//删除该位置条目
ui->listWidget->takeItem(pos);
}
三、QTableWidget
使用QTableWidget 表示一个表格控件. -个表格中包含若干行,每一行又包含若干列.
表格中的每个单元格,是一个QTableWidgetItem对象.
属性 | 说明 |
---|---|
item(int row, int column) | 根据行数列数获取指定的 QTablewidgetItem* |
setltem(int row, int column,QTableWidget*) | 根据行数列数设置表格中的元素 |
currentltem() | 返回被选中的元素 OTableWidgetltem* |
currentRow() | 返回被选中元素是第几行 |
currentColumn() | 返回被选中元素是第几列 |
row(QTableWidgetltem*) | 获取指定 item 是第几行 |
column(QTableWidgetltem*) | 获取指定 item 是第几列 |
rowCount() | 获取行数 |
columnCount() | 获取列数 |
insertRow(int row) | 在第 row 行处插入新行 |
insertColumn(int column) | 在第 column 列插入新列 |
removeRow(int row) | 删除第 row 行 |
removeColumn(int column) | 删除第 column 列 |
setHorizontalHeaderltem(intcolumn, QTableWidget*) | 设置指定列的表头 |
setVerticalHeaderltem(int row,QTableWidget*) | 设置指定行的表头 |
信号
属性 | 说明 |
---|---|
cellclicked(int row, int column) | 点击单元格时触发 |
cellDoubleClicked(int row, intcolumn) | 双击单元格时触发 |
cellEntered(int row, int column) | 鼠标进入单元格时触发 |
currentCellChanged(int row,intcolumn,int previousRow, intpreviousColumn) | 选中不同单元格时触发 |
QTableWidgetItem 核心方法与QListWidgetItem大致相同
实例:
实现一个表格,插入三行元素
四、QTreeWidget
使用QTreeWidget表示一个树形控件.里面的每个元素,都是一QTreeWidgetItem,每QTreeWidgetItem可以包含多个文本和图标,每个文本/图标为一个列.
可以给QTreeWidget 设置顶层节点(顶层节点可以有多个),然后再给顶层节点添加子节点,从而构成树形结构.
属性 | 说明 |
---|---|
clear | 清除所有子节点 |
addTopLevelltem(QTreeWidgetltem*item) | 新增顶层节点 |
topLevelltem(int index) | 获取指定下标的顶层节点 |
topLevelltemCount() | 获取顶层节点个数 |
indexOfTopLevelltem(OTreeWidgetltem*item) | 查询指定节点是顶层节点中的下标 |
takeTopLevelltem(int index) | 删除指定的顶层节点.返回 OTreeWidgetltem*表示被删除的元素 |
currentltem() | 获取到当前选中的节点,返回 OTreeWidgetltem* |
setCurrentltem(OTreeWidgetltem* item) | 选中指定节点 |
setExpanded(bool) | 展开/关闭节点 |
setHeaderLabel(const OString& text) | 设置 TreeWidget 的 header 名称 |
信号
属性 | 说明 |
---|---|
currentltemChanged(QTreeWidgetltem* current,OTreeWidgetltem* old) | 切换选中元素时触发 |
itemClicked(QTreeWidgetltem* item, int col) | 点击元素时触发 |
itemDoubleClicked(QTreeWidgetltem* item,int col) | 双击元素时触发 |
itemEntered(QTreeWidgetltem* item, int col) | 鼠标进入时触发 |
itemExpanded(OTreeWidgetltem* item) | 元素被展开时触发 |
itemCollapsend(QTreeWidgetltem* item) | 元素被折叠时触发 |
QTreeWidgetItem 核心属性和方法
属性 | 说明 |
---|---|
text | 持有的文本 |
textAlignment | 文本对齐方式 |
icon | 持有的图标 |
font | 字体 |
hidden | 是否隐藏 |
disabled | 是否禁用 |
expand | 是否展开 |
sizeHint | 尺寸大小 |
selected | 是否选中 |
addChild(QTreeWidgetItem*) | 新增子节点 |
childCount | 子节点个数 |
child(int index) | 获取指定下标子节点,返回QTreeWidgetItem* |
takeChild(int index) | 删除对应下标子节点 |
removeChild(QTreeWidgetItem* child) | 删除对应子节点 |
parent() | 获取该元素父节点 |
实例:
实现一个添加删除元素的TreeWidegt
Column 1 | Column 2 |
---|
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//修改 标题
ui->treeWidget->setHeaderLabel("动物");
//添加顶层元素
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0,"狗");
ui->treeWidget->addTopLevelItem(item);
//为顶层元素添加子类
QTreeWidgetItem* item1=new QTreeWidgetItem();
item1->setText(0,"中华田园犬");
item->addChild(item1);
//为顶层元素添加子类
QTreeWidgetItem* item2=new QTreeWidgetItem();
item2->setText(0,"边牧");
item->addChild(item2);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_insertTopLevelItem_clicked()
{
//获取输入框内容
const QString str = ui->lineEdit->text();
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0,str);
//添加顶层元素
ui->treeWidget->addTopLevelItem(item);
//将输入框内容清空
ui->lineEdit->clear();
}
void Widget::on_pushButton_InsertItem_clicked()
{
//获取当前选中的
QTreeWidgetItem* parent = ui->treeWidget->currentItem();
//获取输入框内容
const QString str = ui->lineEdit->text();
QTreeWidgetItem* cur = new QTreeWidgetItem();
cur->setText(0,str);
//将当前子类添加
parent->addChild(cur);
//输入框内容清空
ui->lineEdit->clear();
}
void Widget::on_pushButton_DeleteItem_clicked()
{
//获取当前要删除的item
QTreeWidgetItem* cur = ui->treeWidget->currentItem();
if(cur==nullptr)
{
//当前要删除的item为空
return;
}
//获取要删除item的父类,针对顶层节点与子节点删除方式不同
QTreeWidgetItem* parent = cur->parent();
if(parent==nullptr)
{
//为顶层节点
//获取当前节点位置
int index = ui->treeWidget->indexOfTopLevelItem(cur);
//删除顶层节点
ui->treeWidget->takeTopLevelItem(index);
}else{
//子类节点
parent->removeChild(cur);
}
}