【Qt之模型视图】5. Qt库提供的视图便捷类

news2025/1/14 18:45:01

1. 前言

Qt提供了一些便捷的视图类,如QListWidget提供项目列表,QTreeWidget显示多级树结构,QTableWidget提供单元格项的表格。每个类都继承了QAbstractItemView类的行为,QAbstractItemView类实现了项目选择和标题管理的通用行为。
这三个类使用起来方便,但适合于少量数据的存储与显示(存储个几万、十几万的数据还可以),因为它们三个没有将视图和模型进行分离,因此没有视图类灵活。
而且这三个类也不能和模型一起使用。
类关系图如下:
image.png

2. QListWidget使用

QListWidget是一个单级列表,通常使用QListWidget和一些QListWidgetItem进行显示。它可以用来显示一列项目,每个项目可以包含文本、图标或其他自定义的小部件。
使用QListWidget,可以添加和删除项目,设置项目的属性,处理项目的选择和双击事件等。
要使用QListWidget,需要创建一个QListWidget对象,并使用addItem()方法添加项目。每个项目都是一个QListWidgetItem对象,可以设置其文本、图标、工具提示等属性。
还可以使用setSelectionMode()方法设置选择模式,包括单选、多选和扩展选择等。
除了基本的列表功能,QListWidget还提供了一些便捷的方法,如排序、搜索和过滤项目等。
如:

    // 添加项目到列表中
    QStringList items;
    items << "Item 1" << "Item 4" << "Item 2" << "Item 3";
    foreach(QString item, items) {
        QListWidgetItem *listItem = new QListWidgetItem(item);
        listItem->setWhatsThis(listItem->text());
        listItem->setToolTip(listItem->text());
        listItem->setStatusTip(listItem->text());
        listItem->setBackgroundColor(QColor(qrand()%255, qrand()%255, qrand()%255));
        ui->listWidget->addItem(listItem);
    }

    // 设置选择模式为多选
    ui->listWidget->setSelectionMode(QListWidget::MultiSelection);

    // 排序列表
    ui->listWidget->sortItems();

image.png

3. QTreeWidget使用

QTreeWidget是一种用于显示树形结构数据的控件,它基于QTreeView控件,并且提供了更高级的功能。
QTreeWidget可以以树的形式展示一组项目,每个项目可以包含一个或多个子项目。
QTreeWidget中的每个项目都可以包含多列数据,每列数据对应一个QTreeWidgetItem。

QTreeWidget的特点包括:

  1. 支持多列数据:每个项目可以包含多列数据,每列数据可以是不同类型的数据,例如文本、图像等。
  2. 可以设置项目的图标:QTreeWidgetItem可以设置一个图标,用于表示项目的状态或类型。
  3. 支持拖放操作:QTreeWidget可以在项目之间支持拖放操作,实现项目的移动或复制。
  4. 支持排序:QTreeWidget可以通过调用sortItems()函数进行项目的排序,可以根据指定的列进行排序。
  5. 支持编辑:QTreeWidget可以启用项目的编辑功能,允许用户直接在QTreeWidget中编辑项目的数据。
  6. 信号槽机制:QTreeWidget提供了多个信号,可以在项目被选中、编辑完成等事件发生时进行相应的处理。

使用QTreeWidget需要先创建一个QTreeWidget对象,并设置其父窗口或布局。然后通过调用QTreeWidget的各种方法,创建项目、设置项目数据、设置项目图标等。可以使用QTreeWidgetItem的addChild()方法来添加子项目。最后,将QTreeWidget添加到父窗口或布局中即可显示。

QTreeWidget可以通过信号和槽机制来响应用户的操作或处理特定事件。例如,当用户点击一个项目时,QTreeWidget会发出itemClicked()信号,可以连接槽函数来处理该信号并执行相应的操作。
如:

    // 创建QTreeWidget对象
    ui->treeWidget->setColumnCount(2); // 设置列数为2

    // 创建根节点
    QTreeWidgetItem *rootItem = new QTreeWidgetItem(ui->treeWidget);
    rootItem->setText(0, "Root");

    // 添加子节点
    QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);
    childItem1->setText(0, "Child 1");
    childItem1->setText(1, "Data 1");

    QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);
    childItem2->setText(0, "Child 2");
    childItem2->setText(1, "Data 2");

    // 添加根节点的子节点
    QTreeWidgetItem *subChildItem = new QTreeWidgetItem(childItem1);
    subChildItem->setText(0, "Sub Child");
    subChildItem->setText(1, "Sub Data");

    // 设置根节点的图标
    rootItem->setIcon(0, QIcon(":/icons/root.png"));

    // 设置子节点的图标
    childItem1->setIcon(0, QIcon(":/icons/child.png"));
    childItem2->setIcon(0, QIcon(":/icons/child.png"));
    subChildItem->setIcon(0, QIcon(":/icons/subchild.png"));

image.png
QTreeWidget控件对于顶层项和非顶层项处理的方式不同。如移除项,如果是顶层项,则用takeTopLevelItem()方法进行移除;如果非顶层项,则要使用其移除项的父项中的takeChild()方法进行移除。插入也是一样,插入顶层项,使用insertTopLevelItem()方法;如果插入非顶层项,则用其插入项的父项中的insertChild()方法进行插入。
如,删除 :

      QTreeWidgetItem *parent = currentItem->parent();
      int index;

      if (parent) {
          index = parent->indexOfChild(treeWidget->currentItem());
          delete parent->takeChild(index);
      } else {
          index = treeWidget->indexOfTopLevelItem(treeWidget->currentItem());
          delete treeWidget->takeTopLevelItem(index);
      }

插入:

      QTreeWidgetItem *parent = currentItem->parent();
      QTreeWidgetItem *newItem;
      if (parent)
          newItem = new QTreeWidgetItem(parent, treeWidget->currentItem());
      else
          newItem = new QTreeWidgetItem(treeWidget, treeWidget->currentItem());

4. QTableWidget使用

QTableWidget是一个用于显示表格数据的小部件。它承自QTableView,并且提供了额外的功能,比如直接编辑单元格和插入/删除行和列。

其主要特性和使用方法如下:

  1. 表格结构:QTableWidget以行和列的形式组织数据,并可以动态添加或删除行和列。使用setRowCount()和setColumnCount()可以设置表格的行数和列数。

  2. 单元格内容:使用setItem()方法可以将一个QTableWidgetItem对象插入到特定的单元格中,以设置单元格的内容。可以使用QTableWidgetItem的setText()方法设置文本内容,或使用其他数据类型(如图标、颜色等)设置单元格的其他属性。

  3. 单元格编辑:可以在QTableWidget中直接编辑单元格的内容。可以通过设置setEditTriggers()方法来控制哪些单元格可以编辑,例如QAbstractItemView::NoEditTriggers表示所有单元格都不可编辑,而QAbstractItemView::CurrentChanged表示只有当前选中的单元格可编辑。

  4. 表头:QTableWidget可以显示表格的水平和垂直表头,分别对应于列和行。可以使用setHorizontalHeaderLabels()和setVerticalHeaderLabels()方法设置表头的文本。

  5. 选择:可以通过设置setSelectionMode()方法来设置选择模式。例如,选择模式可以是单行、多行、单列或多个单元格。还可以通过设置setSelectionBehavior()方法来控制选择行为,例如选择一整行或一整列。

  6. 排序和排序指示符:QTableWidget支持对表格数据进行排序,并在表头显示排序指示符。可以使用QTableWidget的sortItems()方法对指定列的数据进行排序,也可以通过setSortingEnabled()方法在表格上启用或禁用排序功能。

  7. 单元格合并:可以通过使用setSpan()方法将多个相邻的单元格合并成一个单元格。这在需要合并单元格的情况下提供了更灵活的布局选项。

  8. 数据导入和导出:QTableWidget提供了一些方法来导入和导出表格数据。可以使用setItem()方法将数据从一个模型或其他数据源导入到表格中,并使用item()方法从表格中获取数据。
    如:

    // 设置表格的行数和列数
    ui->tableWidget->setRowCount(5);
    ui->tableWidget->setColumnCount(3);

    // 设置选择行为和选择模式
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

    // 设置表头
    ui->tableWidget->setHorizontalHeaderLabels({"列1", "列2", "列3"});

    // 向单元格中插入数据
    ui->tableWidget->setItem(0, 0, new QTableWidgetItem("数据1"));
    ui->tableWidget->setItem(0, 1, new QTableWidgetItem("数据2"));
    ui->tableWidget->setItem(0, 2, new QTableWidgetItem("数据3"));

    // 在第2行插入一行数据
    ui->tableWidget->insertRow(1);
    ui->tableWidget->setItem(1, 0, new QTableWidgetItem("数据4"));
    ui->tableWidget->setItem(1, 1, new QTableWidgetItem("数据5"));
    ui->tableWidget->setItem(1, 2, new QTableWidgetItem("数据6"));

    for(int i = 0; i < 4; ++i)
    {
        for(int j = 0; j < 3; ++j)
        {
            ui->tableWidget->setItem(i+2, j, new QTableWidgetItem(QString("%1_%2").arg(i+2).arg(j)));
        }
    }

    // 遍历表格中的所有单元格,并打印它们的内容
    for (int row = 0; row < ui->tableWidget->rowCount(); ++row)
    {
        for (int column = 0; column < ui->tableWidget->columnCount(); ++column)
        {
            QTableWidgetItem *item = ui->tableWidget->item(row, column);
            //qDebug() << "(" << row << "," << column << "):" << item->text();
        }
    }

    // 隐藏第一列
    // ui->tableWidget->setColumnHidden(0, true);

image.png

5. 特性

每个类都有许多基于项的公共特性,这些特性可以通过每个类中的相同接口获得。

5.1 隐藏

有时,在项目视图小部件中隐藏项目而不是删除项目是很有用的。所有上述小部件的项都可以隐藏,稍后再显示。可以通过调用isHidden()函数来确定是否隐藏项,并且可以使用setHidden()来隐藏项。
由于此操作是基于项的,因此可用于以上三个类。

5.2 选择

选择项目的方式由小部件的选择模式控制(QAbstractItemView::SelectionMode)。此属性控制用户是否可以选择一个或多个项目,以及在多项目选择中,选择是否必须是一个连续的项目范围。选择模式对上述所有小部件都以相同的方式工作。
image.png
如,使用selectedItems()函数读取小部件中选定的项,并提供可迭代的相关项列表:

      QList<QTableWidgetItem *> selected = tableWidget->selectedItems();
      QTableWidgetItem *item;
      int number = 0;
      double total = 0;

      foreach (item, selected) {
          bool ok;
          double value = item->text().toDouble(&ok);

          if (ok && !item->text().isEmpty()) {
              total += value;
              number++;
          }
      }

5.3 查找

能够在项目视图小部件中查找项通常很有用,无论是作为开发人员还是作为服务提供给用户。以上类都提供了一个通用的findItems()函数,以使其尽可能一致和简单。
根据Qt::MatchFlags中的一组值所指定的标准,搜索条目所包含的文本。可以使用findItems()函数获取匹配项的列表:

      QTreeWidgetItem *item;
      QList<QTreeWidgetItem *> found = treeWidget->findItems(
          itemText, Qt::MatchWildcard);

      foreach (item, found) {
          treeWidget->setItemSelected(item, true);
          // to do Something
      }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1401245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《WebKit 技术内幕》之五(1): HTML解释器和DOM 模型

第五章 HTML 解释器和 DOM 模型 1.DOM 模型 1.1 DOM标准 DOM &#xff08;Document Object Model&#xff09;的全称是文档对象模型&#xff0c;它可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。这里的文档可以是 HTML 文档、XML 文档或者 XHTML 文档。D…

ubuntu 相关内容

ubuntu 优盘安装&#xff1a; 台式机安装纯ubuntu系统的操作步骤-CSDN博客https://blog.csdn.net/youngwah292/article/details/127032009?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170583039216800213099577%2522%252C%2522scm%2522%253A%252220140713.1301…

音视频开发ffmpeg

ffmpeg数据结构 重要的结构体 压缩数据 avpacket 帧数据 avframe 管家&#xff1a; avformatcontext 格式上下文 文件是一种协议 解协议&#xff08;http、rtsp rtmp mms tcp udp…&#xff09; AVIOContext URLProtocol URLContext存储音视频中的协议类型和状态 有缓冲区…

74.搜索二维矩阵 - 力扣(LeetCode)

题目描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回…

爬虫案例—雪球网行情中心板块数据抓取

爬虫案例—雪球网行情中心板块数据抓取 雪球网行情中心网址&#xff1a;https://xueqiu.com/hq 目标&#xff1a;市场一览板块、热股榜板块、新股预告板块、关注排行榜板块 import datetimeimport requestsheaders {user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10…

算法优化:LeetCode第122场双周赛解题策略与技巧

接下来会以刷常规题为主 &#xff0c;周赛的难题想要独立做出来还是有一定难度的&#xff0c;需要消耗大量时间 比赛地址 3011. 判断一个数组是否可以变为有序 public class Solution {public int minimumCost(int[] nums) {if (nums.length < 3) {// 数组长度小于3时&a…

即插即用篇 | AKConv:具有任意采样形状和任意参数数量的卷积核

基于卷积操作的神经网络在深度学习领域取得了显著的成果,但标准卷积操作存在两个固有缺陷。一方面,卷积操作受限于局部窗口,无法捕捉其他位置的信息,而其采样形状是固定的。另一方面,卷积核的大小固定为kk,呈固定的正方形形状,而参数数量往往随大小呈平方增长。显然,不…

章鱼网络 Community Call #17|打造全新 Omnity 跨链协议

香港时间2024年1月8日12点&#xff0c;章鱼网络举行第17期 Community Call。 对于 Octopus Community 而言&#xff0c;2023年是一个分水岭。我们如期兑现我们的承诺&#xff0c;成功上线了包括 $NEAR Restaking 和 Adaptive IBC 在内的完整的 Octopus 2.0。 自从我们在2023年…

编曲学习:Cubase12导入Cubasis工程的方法!

Steinberg 发布 Cubasis 3 项目导入器&#xff0c;可将 Cubasis 的项目导入到 Cubase 使用https://m.midifan.com/news_body.php?id35635 我偶然看到这个文章&#xff0c;不过发现Cubase12默认好像没有这个选项&#xff0c;心想着要是移动端能和PC端同步&#xff0c;感觉会挺…

腾讯云服务器价格查询,2024更新

腾讯云服务器租用优惠价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器646元15个月&#xff1b;云服务器CVM S5实例2核2G配置280.8元一年、2核4G…

力扣509. 斐波那契数

动态规划 思路&#xff1a; 斐波那契数通式&#xff1a;F(n) F(n - 1) F(n - 2)&#xff1b;以此为状态转移方程&#xff0c;对其进行动态规划&#xff1b;边界条件&#xff1a; F(0) 0F(1) 1使用两个变量来存储上一组结果&#xff1b; class Solution { public:int fib(…

触摸屏监控双速电动机-PLC I/O电路设计

PLC的输入接线电路图 PLC的输入接线电路如图1-21所示。24VDC电源选用0.7mm2的棕色和蓝色软铜导线&#xff0c;弱电信号线用0.5~0.7mm2的黑色或者白色软铜导线。 PLC输入接线图 PLC的输出接线电路图 PLC的输出接线电路如图1-22所示。AC220V接触器型号为CJX2-12&#xff0c;线…

Kubernetes实战(十八)-Pod配置污点和容忍

1 污点 1.1 污点简介 亲和性调度的方式都是站在Pod的角度上&#xff0c;通过在Pod上增加属性来将Pod调度到到指定的节点上&#xff0c;其实也可以站在Node节点的角度上&#xff0c;通过给Node节点设置属性&#xff0c;来决定是否允许Pod调度过来&#xff0c;这就是污点。 No…

数据结构代码实现 —— 单链表【Java】

单链表的概述及性质等在篇不做赘述&#xff0c;有需要可移步以下文章&#xff1a; 《数据结构 C语言版 严蔚敏 第2版》&#xff1a;线性表https://blog.csdn.net/weixin_43551213/article/details/134048025 以下仅展示使用 Java 实现单链表 结点结构定义&#xff1a; publ…

国外邮箱服务:功能、作用与价格全面解析

不同于我们熟悉的国内邮箱服务&#xff08;如163、QQ邮箱等&#xff09;&#xff0c;国外邮箱通常指的是海外提供商所提供的电子邮件服务&#xff0c;如谷歌的Gmail、微软的Outlook、雅虎的Yahoo Mail等&#xff0c;当然也有特殊的比如Zoho Mail邮箱&#xff0c;国内外双版本&a…

Docker(四)操作容器

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 操作 Docker 容器 容器是 Docker 又一核心概念。 简单的说&#xff0c;容器是独立运行的一个或一组应用&#xff0c;以及它们的运行态环境…

算法专题[递归-搜索-回溯-2-DFS]

算法专题[递归-搜索-回溯-2-DFS] 一.计算布尔二叉树的值&#xff1a;1.思路一&#xff1a;2.GIF题目解析 二.求根节点到叶子节点的数字之和1.思路一&#xff1a;2.GIF题目解析 三.二叉树剪枝1.思路一&#xff1a;2.GIF题目解析 四.验证二叉搜索树1.思路一&#xff1a;2.GIF题目…

C++学习笔记——指针

1&#xff0c;指针的基本概念 指针的作用&#xff1a;可以通过指针间接访问内存 内存的编号是从0开始记录的&#xff0c;一般用十六进制数字表示可以利用指针变量保存地址 上图中的p就是a变量的指针&#xff0c;也可以记作*a 2&#xff0c;指针变量的定义和使用 指针变量定…

AI大模型开发架构设计(3)——如何打造自己的大模型

文章目录 如何打造自己的大模型1 新时代职场人应用AIGC的5重境界2 人人需要掌握的大模型原理职场人都能听懂的大语音模型的训练过程职场人都能听得懂的大语言模型的Transformer推理过程 3 如何构建自己的大模型需要具备三个方面的能力LangChain是什么&#xff1f;LangChain主要…

【精选】中间件 tomcat漏洞复现

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…