【Qt开发】多元素控件
目录
前言:
1,List Widget
2,Table Widget
3,Tree Widget
前言:
Qt提供的多元素控件有QListWidget、QListView、QTableWidget、QTableView、 QTreeWidget、QTreeView。
这些控件又可以分为两类——xxxWidget和xxxView。xxxView是更偏于底层。这种类型是基于 MVC 设计的控件。MVC是一种软件架构设计模式,用于将应用程序分割为三个核心组件,即模型数据-视图-控制器三大类。模型数据直接管理和存储应用程序的核心数据,视图负责显示数据,控制器是模型与视图之间的中介者,负责模型数据与视图之间的交互。
xxxView就是MVC中的视图这方面。它自身不持有数据。因此,若要使用View,就需要自己实现模型和控制器部分,并将其关联起来,这样下来比较麻烦。比如使用 QTableView 的时候就需要创建一个 QStandardModel 对象将其关联起来。
xxxWidget 基于 xxxView 同时把模型数据和控制器都实现好了,可以直接使用。但这些功能都是系统设置好的,比较有限。
1,List Widget
使用 QListWidget 能够显示一个纵向的列表。如下:
核心属性、核心方法和核心信号如下:
在上述介绍中所提到的类 QListWidgetItem 表示 QListWidget 中的一个元素,其核心方法如下(本质上就是一个 "文本+图标" 构成的)。
ui->pushButton_insert->setText("新增");
ui->pushButton_delete->setText("删除");
ui->listWidget->addItem("C++");
ui->listWidget->addItem("Java");
ui->listWidget->addItem("Python");
// 也可以使用下面形式新增条目
// ui->listWidget->addItem(new QListWidgetItem("C++"));
// ui->listWidget->addItem(new QListWidgetItem("Java"));
// ui->listWidget->addItem(new QListWidgetItem("Python"));
// 纵向的列表
void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
if (current != NULL && previous != NULL) {
qDebug() << "当前选中:" << current->text() << "之前选中:" << previous->text();
}
}
void Widget::on_pushButton_insert_clicked()
{
// 获取到输⼊框的内容
const QString& text = ui->lineEdit->text();
if (text.isEmpty()) {
return;
}
ui->listWidget->addItem(text);
}
void Widget::on_pushButton_delete_clicked()
{
// 获取当前被选中的元素
int row = ui->listWidget->currentRow();
if (row < 0) {
return;
}
// 删除这⼀⾏
ui->listWidget->takeItem(row);
}
2,Table Widget
QTableWidget 表示一个表格控件。一个表格中包含若干行,每一行又包含若干列。表格中的每个单元格是一个 QTableWidgetItem 对象。QTableWidget 的核心方法和信号如下:
QTableWidgetItem 核心方法如下:
// 创建2⾏2列
ui->tableWidget->insertRow(0);
ui->tableWidget->insertRow(1);
ui->tableWidget->insertColumn(0);
ui->tableWidget->insertColumn(1);
// 给2列设定列名(设置水平方向的表头)
ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("学号"));
ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("姓名"));
// 设置初始数据
ui->tableWidget->setItem(0, 0, new QTableWidgetItem("1001"));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem("张三"));
ui->tableWidget->setItem(1, 0, new QTableWidgetItem("1002"));
ui->tableWidget->setItem(1, 1, new QTableWidgetItem("李四"));
3,Tree Widget
QTreeWidget 表示一个树形控件。该控件里面的每个元素都是一个 QTreeWidgetItem,每个 QTreeWidgetItem 可以包含多个文本和图标,每个文本和图标为一个列。
运用 QTreeWidget 时,可以给 QTreeWidget 设置顶层节点(顶层节点可以有多个),然后再给顶层节点添加子节点,从而构成树形结构。
QTreeWidget 核心方法和核心信号如下:
QTreeWidgetItem 核心属性和核心方法如下:
ui->treeWidget->setHeaderLabel("动物");
// 新增顶层节点。每个节点都可以设置多个列,此处只设置一列,即0
QTreeWidgetItem* item1 = new QTreeWidgetItem();
item1->setText(0, "猫");
ui->treeWidget->addTopLevelItem(item1);
QTreeWidgetItem* item2 = new QTreeWidgetItem();
item2->setText(0, "狗");
ui->treeWidget->addTopLevelItem(item2);
QTreeWidgetItem* item3 = new QTreeWidgetItem();
item3->setText(0, "⻦");
ui->treeWidget->addTopLevelItem(item3);
// 添加子节点
QTreeWidgetItem* item4 = new QTreeWidgetItem();
item4->setText(0, "熊猫");
item1->addChild(item4);
// 删除树形控件列表中的节点
void Widget::on_pushButton_clicked()
{
// 获取到当前选中的节点
QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
if (currentItem == NULL) {
return;
}
// 获取当前节点的⽗节点
QTreeWidgetItem* parent = currentItem->parent();
if (parent == NULL) { // 顶层节点
int index = ui->treeWidget->indexOfTopLevelItem(currentItem);
ui->treeWidget->takeTopLevelItem(index);
}
else { // ⾮顶层节点
parent->removeChild(currentItem);
}
}