当前位置: 首页 > 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);

    }

}

http://www.xdnf.cn/news/666487.html

相关文章:

  • JavaScript性能优化全景指南
  • QT 框架学习笔记
  • Elasticsearch性能优化全解析
  • uni-app(6):Vue3语法基础下
  • Nginx 性能优化全解析:从进程到安全的深度实践
  • 【JavaScript 性能优化方法】
  • 【前端】【Vue3】vue3性能优化总结
  • MySQL 窗口函数深度解析:语法、应用场景与性能优化
  • day 23 机器学习管道(pipeline)
  • 项目启动以及Vue初识
  • Python整合Milvus向量数据库案例实战
  • 通过HIVE SQL获取每个用户的最大连续登录时常
  • 【Opencv+Yolo】Day2_图像处理
  • Vim 常用命令
  • 《数据结构初阶》【番外篇:快速排序的前世今生】
  • MySQL的主从复制
  • MYSQL 学习笔记
  • Django ToDoWeb 服务
  • 4.8.5 利用Spark SQL统计网站每月访问量
  • sharding jdbc的使用,如何在Spring中实现数据库的主从分离、分库分表等功能
  • Java· swing 小demo
  • EasyDarwin的配置与使用
  • MMAction2重要的几个配置参数
  • 《算法笔记》13.2小节——专题扩展->树状数组(BIT) 问题 C: Count Inversions
  • C++面试题:虚函数表(vtable)的底层实现机制与应用解析
  • 守护手部稳定,手抖健康护理全攻略
  • 【关于C++跨平台开发的挑战】
  • 【C++】内存管理,深入解析new、delete
  • 【DAY30】模块和库的导入
  • Docker Volume(存储卷)