文章目录
- 1、QListWidget
- 2、QTableWidget
- 3、QTreeWidget
多元素控件主要分为3个部分,QList,QTable,QTree。
每个部分都有View和Widget,W基于V封装而来。软件开发中MVC架构三个字母分别代表model数据,view视图,controller控制器(数据和视图之间的业务流程)。View只负责视图,而Widget基于View,也实现了M和C,提供了方便使用的API。
这几个Widget在运行时写入的数据都在内存中,并不保存。可以保存到一个文件中,运行时读取文件即可。
1、QListWidget
insert中row参数表示新的元素插入到第几行。
信号
写一个程序,放一个List Widget到界面中。控件中Item Views和Item Widgets,放其中一个到界面后,右击该控件,变型为其它控件。右侧再放一个Line Edit,其下面放两个Push Button。两个按钮的名字改为pushButton_insert和pushButton_delete。
QListWidget控件直接添加内容的方法是右键编辑项目,选择+,然后写入内容。
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->listWidget->addItem("C++");ui->listWidget->addItem("Python");ui->listWidget->addItem(new QListWidgetItem("C"));
}void Widget::on_pushButton_insert_clicked()
{const QString& text = ui->lineEdit->text();ui->listWidget->addItem(text);
}void Widget::on_pushButton_delete_clicked()
{// 获取被选中的元素int row = ui->listWidget->currentRow();if (row < 0) return ;ui->listWidget->takeItem(row);
}// 头文件添加#include <QListWidgetItem>
// 感知变化的槽函数
void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{if (current != nullptr)qDebug() << "当前选中的元素: " << current->text();if (previous != nullptr)qDebug() << "上次选中的元素: " << previous->text();
}
2、QTableWidget
QTableWidget核心方法
QTableWidgetItem信号
方法
在界面右键tableWidget直接编辑
代码编辑
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->tableWidget->insertRow(0);ui->tableWidget->insertRow(1);ui->tableWidget->insertRow(2);ui->tableWidget->insertColumn(0);ui->tableWidget->insertColumn(1);ui->tableWidget->insertColumn(2);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("101"));ui->tableWidget->setItem(0, 1, new QTableWidgetItem("张三"));ui->tableWidget->setItem(0, 2, new QTableWidgetItem("22"));
}
按钮槽函数
void Widget::on_pushButton_insertRow_clicked()
{int rowCount = ui->tableWidget->rowCount();ui->tableWidget->insertRow(rowCount);
}void Widget::on_pushButton_deleteRow_clicked()
{int curRow = ui->tableWidget->currentRow();ui->tableWidget->removeRow(curRow);
}void Widget::on_pushButton_insertColumn_clicked()
{int colCount = ui->tableWidget->columnCount();ui->tableWidget->insertColumn(colCount);const QString& text = ui->lineEdit->text();ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(text));
}void Widget::on_pushButton_deleteColumn_clicked()
{int curColumn = ui->tableWidget->currentColumn();ui->tableWidget->removeColumn(curColumn);
}
3、QTreeWidget
QTreeWidget方法
QTree这个树形结构是从根节点的下一层开始计算的,这一层成为TopLevelItem。顶层的节点也类似于List的结构。
QTreeWidgetItem
parent()则是获取该元素的父节点。
可以在界面中右键编辑项目,添加项目,子项目来建立树。
代码编辑
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 添加顶层节点ui->treeWidget->setHeaderLabel("动物");QTreeWidgetItem* item1 = new QTreeWidgetItem();item1->setText(0, "猫"); // 设一列ui->treeWidget->addTopLevelItem(item1);// 添加子节点QTreeWidgetItem* item3 = new QTreeWidgetItem();item3->setText(0, "蓝猫");item1->addChild(item3);// 添加顶层节点QTreeWidgetItem* item2 = new QTreeWidgetItem();item2->setText(0, "狗"); // 设一列ui->treeWidget->addTopLevelItem(item2);// 添加子节点QTreeWidgetItem* item4 = new QTreeWidgetItem();item4->setText(0, "中华田园犬");item2->addChild(item4);
}
按钮槽函数
void Widget::on_pushButton_insertTop_clicked()
{const QString& text = ui->lineEdit->text();QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(0, text);ui->treeWidget->addTopLevelItem(item);
}void Widget::on_pushButton_insertItem_clicked()
{// 获取当前选中的节点QTreeWidgetItem* curItem = ui->treeWidget->currentItem();if (curItem == nullptr) return ;const QString& text = ui->lineEdit->text();QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(0, text);// 插入到选中节点的子节点中curItem->addChild(item);
}void Widget::on_pushButton_deleteItem_clicked()
{QTreeWidgetItem* curItem = ui->treeWidget->currentItem();if (curItem == nullptr) return ;QTreeWidgetItem* parent = curItem->parent();if (parent == nullptr){// 获取在顶层中的位置int index = ui->treeWidget->indexOfTopLevelItem(curItem);ui->treeWidget->takeTopLevelItem(index);}else parent->removeChild(curItem);
}
结束。