目录
一、QListWidget
多元素控件
下面介绍多元素控件,Qt中常见的多元素控件:
QListWidget QTableWidget QTreeWidget
QListView QTableView QTreeView
***Widget和***View的区别
大体上,Widget是基于View封装的,View源自于MVC开发结构,M (Model) V(View) C(Controller)
M负责数据处理
V负责用户视图
而核心就是C负责将处理好的数据如何展现到View,以及用户操作怎么传递给M
***View只实现了视图,不实现数据和View的交互,如果使用***View类,则需要自己实现控制器,而***Widget封装了***View,使用更方便。
属性
QListWidget就是一个列表。

核心方法

核心信号

列表中的每一项叫做QListWidgetItem,它的核心方法如下。


cpp
ui->listWidget->addItem("C++");
ui->listWidget->addItem("Java");
ui->listWidget->addItem("Python");
当界面上,鼠标选中的列表项发生改变,就会触发信号,编写槽函数如下
cpp
void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current,
QListWidgetItem *previous)
{
if (current != NULL && previous != NULL) {
qDebug() << "当前选中: " << current->text()
<< "之前选中: " << previous->text();
}
}
编写按钮点击信号的槽函数,执行新增一行、删除一行
cpp
void Widget::on_pushButton_clicked()
{
// 获取到输⼊框的内容
const QString& text = ui->lineEdit->text();
if (text.isEmpty()) {
return;
}
ui->listWidget->addItem(text);
}
void Widget::on_pushButton_2_clicked()
{
// 获取当前被选中的元素
int row = ui->listWidget->currentRow();
// 删除这⼀⾏
ui->listWidget->takeItem(row);
}
二、QTableWidget
是一个表格控件,有行和列,每一个单元格是QTableWidgetItem对象。
属性
核心方法

对于QTableWidgetItem来说,核心信号如下

对于一个单元格,核心方法如下

代码实践

cpp
ui->tableWidget->insertRow(0);
ui->tableWidget->insertRow(1);
ui->tableWidget->insertRow(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("年龄"));
// 设置初始数据
ui->tableWidget->setItem(0, 0, new QTableWidgetItem("1001"));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem("张三"));
ui->tableWidget->setItem(0, 2, new QTableWidgetItem("20"));
ui->tableWidget->setItem(1, 0, new QTableWidgetItem("1002"));
ui->tableWidget->setItem(1, 1, new QTableWidgetItem("李四"));
ui->tableWidget->setItem(1, 2, new QTableWidgetItem("21"));
ui->tableWidget->setItem(2, 0, new QTableWidgetItem("1003"));
ui->tableWidget->setItem(2, 1, new QTableWidgetItem("王五"));
ui->tableWidget->setItem(2, 2, new QTableWidgetItem("19"));
编写按钮的槽函数
cpp
void Widget::on_pushButton_addRow_clicked()
{
// 1. 获取到⾏数
int rowCount = ui->tableWidget->rowCount();
// 2. 插⼊新⾏
ui->tableWidget->insertRow(rowCount);
}
void Widget::on_pushButton_delRow_clicked()
{
// 1. 获取选中的⾏号
int curRow = ui->tableWidget->currentRow();
// 2. 删除对应⾏
ui->tableWidget->removeRow(curRow);
}
void Widget::on_pushButton_addCol_clicked()
{
// 1. 获取到列数
int colCount = ui->tableWidget->columnCount();
// 2. 插⼊新列
ui->tableWidget->insertColumn(colCount);
// 3. 设置列名
const QString& name = ui->lineEdit->text();
ui->tableWidget->setHorizontalHeaderItem(colCount, new
QTableWidgetItem(name));
}
void Widget::on_pushButton_delCol_clicked()
{
// 1. 获取选中的列号
int curCol = ui->tableWidget->currentColumn();
// 2. 删除对应的列
ui->tableWidget->removeColumn(curCol);
}

默认情况下,单元格是可以编辑的,如果想禁用编辑,则
cppui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
三、QTreeWidget
逻辑上是树形结构的控件,每一个元素都是⼀个 QTreeWidgetItem , 每个QTreeWidgetItem包含多个图标/文本。
给 QTreeWidget 设置顶层节点(顶层节点可以有多个), 然后再给顶层节点添加⼦节点, 从⽽构成
树形结构。
属性
核心方法

核心信号

每一个顶层节点,就是QTreeWidgetItem,它的核心属性如下

QTreeWidgetItem的核心方法

- 代码实践

cpp
ui->setupUi(this);
//设置根节点标题
ui->treeWidget->setHeaderLabels({"动物","小动物"});
ui->treeWidget->setColumnCount(2);
//增加顶层节点
QTreeWidgetItem* item= new QTreeWidgetItem();
item->setText(0,"猫");
ui->treeWidget->addTopLevelItem(item);
QTreeWidgetItem* item_fly = new QTreeWidgetItem();
item_fly->setText(1,"鸟");
ui->treeWidget->addTopLevelItem(item_fly);
QTreeWidgetItem* item2= new QTreeWidgetItem();
item2->setText(0,"狗");
ui->treeWidget->addTopLevelItem(item2);
//增加一些子节点
QTreeWidgetItem* item4 = new QTreeWidgetItem();
item4->setText(0,"黑猫");
item->addChild(item4);
QTreeWidgetItem* item5= new QTreeWidgetItem();
item5->setText(0,"白猫");
item->addChild(item5);
QTreeWidgetItem* item6 = new QTreeWidgetItem();
item6->setText(0,"大黄狗");
item2->addChild(item6);
QTreeWidgetItem* item7 = new QTreeWidgetItem();
item7->setText(0,"泰迪");
item2->addChild(item7);
QTreeWidgetItem* item8 = new QTreeWidgetItem();
item8->setText(1,"鹦鹉");
item_fly->addChild(item8);
ui->treeWidget->expandAll();
cpp
void Widget::on_pushButton_addTop_clicked()
{
// 获取输⼊框内容
const QString& text = ui->lineEdit->text();
if (text.isEmpty()) {
return;
}
// 添加到顶层节点中
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0, text);
ui->treeWidget->addTopLevelItem(item);
}
void Widget::on_pushButton_addCom_clicked()
{
// 获取输⼊框内容
const QString& text = ui->lineEdit->text();
if (text.isEmpty()) {
return;
}
// 获取到当前选中的节点
QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
if (currentItem == nullptr) {
return;
}
// 构造新的 item
QTreeWidgetItem* newItem = new QTreeWidgetItem();
newItem->setText(0, text);
// 添加 item 到选中节点
currentItem->addChild(newItem);
// 展开⽗节点
currentItem->setExpanded(true);
}
void Widget::on_pushButton_delete_clicked()
{
// 获取到当前选中的节点
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);
}
}
