当前位置: 首页 > news >正文

【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);

    }

}

相关文章:

  • [Java恶补day8] 3. 无重复字符的最长子串
  • leetcode 53. 最大子数组和
  • 【分治】计算右侧小于当前元素的个数
  • 基于深度学习双塔模型的食堂菜品推荐系统
  • Tailwind css实战,基于Kooboo构建AI对话框页面(二)
  • 【leetcode】209. 长度最小的子数组
  • 深度学习————注意力机制模块
  • 「Python教案」循环语句的使用
  • 纯C++ 与欧姆龙PLC使用 FINS TCP通讯源码
  • 【Python训练营打卡】day37 @浙大疏锦行
  • 如何寻找大模型在企业业务中的价值?
  • 蓝桥杯b组c++赛道---字典树
  • IPv4地址的主要配置项介绍
  • 语音识别算法的性能要求一般是多少
  • 基于多流特征融合与领域知识整合的CNN-xLSTM-xAtt网络用于光电容积脉搏波信号的无创血压估计【代码已复现】
  • Matlab中gcb、gcbh、gcs的区别
  • Cursor 与DeepSeek的完美契合
  • 实时同步缓存,与阶段性同步缓存——补充理解《补充》
  • OpenCV 图像像素的读写操作
  • leetcode hot100刷题日记——18.搜索插入位置
  • 百度联盟的网站怎么做/怎么在线上推广自己的产品
  • 投票网站建设/网络营销公司有哪些
  • 做情书直接点网站/东莞网络推广营销
  • 临沂网站建设那家好/网站设计制作公司
  • 网络营销包括的主要内容有/外贸推广优化公司
  • 网站建设手机软件/站长seo查询