Qt:QListWidget、QTableWidget、QTreeWidget

目录

一、QListWidget

多元素控件

属性

二、QTableWidget

属性

三、QTreeWidget

属性


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

默认情况下,单元格是可以编辑的,如果想禁用编辑,则

cpp 复制代码
ui->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);
     }
}