Qt

2023-11-13

Qt | QListView、QListWidget、QTableView、QTableWidget的使用示例及区别



1、简介

QListView、QListWidget是列表形式展示的控件。

QTableView、QTableWidget是表格形式展示控件。

继承关系:带Widget的继承自View,即:QListWidget是继承QListView,QTableWidget继承自QTableView。

区别:QListView是基于Model,而QListWidget基于Item。这是它们的本质区别。QTableView、QTableWidget同理。

由于QListView和QTableView是基于model的,需要自己来建模(例如建立QStringListModel、QSqlTableModel等),保存数据,这样就大大降低了数据冗余,提高了程序的效率,以及能更方便的进行我们自己需要展示的内容,但是需要我们对数据建模有一定了解。

而QListWidget相当于是QListView的升级版,它已经自己为我们建立了一个数据存储模型(QListWidgetItem),操作方便,直接调用addItem即可添加项目(ICON,文字)。QTableView、QTableWidget同理。


2、使用示例

这四个类共有的一些设置包括:

  • 交替行颜色显示:
    void setAlternatingRowColors(bool enable);
    
  • 设置选中模式:
    void setSelectionMode(QAbstractItemView::SelectionMode mode);
    
  • 设置视图模式,包含列表模式和图标模式:
    void setViewMode(ViewMode mode);
    

1、QListView

向QListView中添加条目需借助QAbstractListModel,这里我使用字符串列表模型(QStringListModel)进行示例。

    // 设置string模型
    QStringListModel* strListModel = new QStringListModel(this);
    ui->listView->setModel(strListModel);

    // 设置选中模式为扩展模式,即可多选也可单选
    ui->listView->setSelectionMode(QListView::ExtendedSelection);

    // 设置显示
    QStringList strList = {"listview1", "listview2", "listview3"};
    qobject_cast<QStringListModel*>(ui->listView->model())->setStringList(strList);

    // 如果内容有变化需要更新显示,就重新setStringList
    strList.append("listview4");
    qobject_cast<QStringListModel*>(ui->listView->model())->setStringList(strList);

    // 获取QListView当前的列表内容:首先需要获得QListView的model,通过model获取StringList
    QStringListModel* m = qobject_cast<QStringListModel*>(ui->listView->model());
    QStringList items = m->stringList();

效果图:

2、QTableView

见博客:https://blog.csdn.net/qq153471503/article/details/123423931

3、QListWidget

QListWidget使用起来更简单,直接使用addItem添加即可。

    // 设置选中模式
    ui->listWidget->setSelectionMode(QListWidget::ExtendedSelection);

    // 添加一项
    ui->listWidget->addItem("listwidget1");

    // 添加一项(带图标)
    ui->listWidget->addItem(new QListWidgetItem(QIcon(QPixmap(100, 100)), "listwidget2"));

效果图:

QListWidget添加条目比较简单,但是删除需要额外注意!

QListWidget提供了两个函数:removeItemWidgettakeItem,两者的区别:

  • removeItemWidget:只是删除该item对应的widget,不会删除该item,如果这个item存在内容还是会保留显示
  • takeitem直接删除该item
  • clear函数清除所有的item

所以,如果想真正的删除一项,需要使用takeitem。

在使用takeitem时有两点需要注意:

  • 该函数执行成功会返回一个QListWidgetItem对象,并且需要手动的delete,若执行失败则返回nullptr
  • 每成功的执行一次takeitem,列表内容的索引都会重新更新。

以下示例为删除选中的item:

    while(true)  // 循环删除单个就是多删除
    {
        // 当前选中项的index
        QModelIndexList l = ui->listWidget->selectionModel()->selectedIndexes();

        if(l.isEmpty())
            break;

        // 从QListWidget中删除item
        QListWidgetItem* item = ui->listWidget->takeItem(l[0].row());

        // 必须释放item
        delete item;
    }

4、QTableWidget

    // 设置水平拉伸显示,这样比较好看
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    // 设置行数
    ui->tableWidget->setRowCount(3);

    // 设置列数
    ui->tableWidget->setColumnCount(3);

    // 设置垂直表头
    ui->tableWidget->setVerticalHeaderLabels({"1月", "2月", "3月"});

    // 设置水平表头
    ui->tableWidget->setHorizontalHeaderLabels({"班级一", "班级二", "班级三"});

效果:

添加数据:

    // 设置数据
    ui->tableWidget->setItem(0, 0, new QTableWidgetItem("item11"));
    ui->tableWidget->setItem(1, 0, new QTableWidgetItem("item21"));

    // 设置数据
    QTableWidgetItem* item = new QTableWidgetItem("item12");
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);  // 居中显示
    item->setFlags(Qt::ItemIsEnabled);  // 设置为不可编辑
    ui->tableWidget->setItem(0, 1, item);

效果:

将单元格设置成QComboBox,使单元格支持下拉选择:

    // 将单元格设置成QComboBox
    QComboBox* comboBox = new QComboBox();
    comboBox->addItems({"abc", "def"});
    ui->tableWidget->setCellWidget(0, 2, comboBox);

效果:

修改单元格内容:

    // 修改数据,修改前注意要检查修改的这个单元格有没有item
    QTableWidgetItem* channgeItem = ui->tableWidget->item(0, 0);
    if(channgeItem)
    {
        channgeItem->setText(channgeItem->text() + "-channged");
    }

获取单元格内容:

    // 获取普通单元格的数据
    qDebug() << ui->tableWidget->item(0, 0)->text();

    // 获取QComboBox单元格的数据
    qDebug() << qobject_cast<QComboBox*>(ui->tableWidget->cellWidget(0, 2))->currentText();

删除单元格内容:

    // 删除单元格
    QTableWidgetItem* deleteItem = ui->tableWidget->takeItem(0, 0);
    if(deleteItem)
    {
        delete  deleteItem;
    }

ends…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 的相关文章

  • 如何在Qt WebKit中将网页保存为“另存为完整网页”

    我需要使用 Qt WebKit 保存网页 类似于 另存为完整网页 以下是我的要求 保存索引html文件 维护实体编码 需要下载所有链接的图像和其他资源 需要将html页面中的资源路径更改为本地下载路径 需要维护网页当前状态 我可以使用 Qt
  • Qt - 如何在 QGraphicsPixmapItem 中显示 gif(动画)图像

    我正在尝试在 QGraphicsPixmapItem 中使用一张闪烁的图像 显示的图像没有动画效果 下面是原始图像 下面是在 QGraphicsPixmapItem 中使用此图像的 QGraphicsScene 有人能说一下如何实现这一目标
  • 如何使小部件溢出以使滚动条出现在 Qt 中?

    我的小部件的结构是 QWidget 定制为带有圆角边框的面板 要在边界内包含一个带有滚动条并带有边距的区域 然后我将其放入其中 QScrollArea 与 QVBoxLayout 垂直添加内容 然后我在其中添加一系列 标题间距为 0 的 Q
  • QCalendarWidget - 如何突出显示日期

    我有一个QList
  • 使用 Qt 进行拖放:悬停时了解目标应用程序 - 这可能吗?

    我目前正在探索从 Qt 应用程序拖放到未知目标应用程序的可能性 问题是 Qt 应用程序是否可以接收有关即将接收 drop 的应用程序的信息 例如进程名称或标题 一个 虚构的 示例可以是将绘图从 Qt 窗口拖动到文本编辑器或电子表格编辑器 在
  • 来自无符号字符缓冲区的 QImage(jpg 格式)

    我有类型的缓冲区unsigned char 我用JPG图像填充 我想使用此缓冲区将图像绘制到 QLabel 中的应用程序屏幕上 我已经这样做了 但图像不正确 谁能告诉我最好的方法是什么 QPixmap pix QPixmap fromIma
  • QMainWindow::showMaximized() 不更新大小

    我正在尝试创建一个QMainWindow封装一个QGraphicsView我把它放进去 我希望它一开始就最大化 所以我这样做 QMainWindow mainWindow new QMainWindow mainWindow gt setW
  • Qt Designer 与手动编码

    每次我使用图形工具包开始一个项目时 第一个冲突就会发生在如何处理视觉设计和小部件布局的决定上 图形工具还是手动编码 这是一个非常棘手 主观的问题 因为大多数人会根据个人喜好来决定 它还很大程度上取决于图形工具的质量 在这种情况下 我想只关注
  • 将信号/槽(QObject)添加到 QGraphicsItem:性能受到影响?

    我想将信号 槽添加到 QGraphicsItem 以便我可以从另一个线程访问 QGraphicsItemObjects 我知道有两个选项 使用 QGraphicsObject 或从 QObject 和 QGraphicsItem 继承 使用
  • 如何找到 QDockWidget 标题栏的高度?

    我正在尝试找到 a 的高度QDockWidget标题栏 以便对自定义布局进行一些智能调整大小 但标题栏不是单独的小部件 它内置于停靠小部件的私有布局中 并且没有成员可以访问它 还有其他方法可以找到它的高度吗 是的 您可以使用以下命令找到标题
  • 为 Visual Studio 2012 编译 Qt 4.8.x

    我应该采取哪些步骤来编译适用于 Visual Studio 2012 的 Qt 版本 4 8 x 我已经仔细遵循了已接受答案中的说明这个问题 https stackoverflow com questions 5601950 how to
  • Qt 远程文件浏览器

    我想知道是否有人使用过 Qt 远程文件浏览器 根据我的理解 我有两个选择 当涉及到远程文件时 将 QFileDilaog 与自定义代理模型结合使用 该模型将负责提供远程文件 目录结构 使用自定义对话框 并为本地文件提供标准文件系统模型 为远
  • Qt、PushButton、id 属性?有什么方法可以知道点击了哪个按钮

    void MainWindow addRadioToUI int button cunter 4 while database isEmpty button cunter QPushButton one new QPushButton Pl
  • 如何在Qt中设置编译器?

    我对 Qt 完全陌生 我下载了离线版本 Qt 5 3 2 for Windows 64 bit VS 2013 OpenGL 573 MB 我无法编译我的项目 I have Qt Creator 3 2 1 开源 基于Qt 5 3 2 MS
  • QT 应用程序运行时错误?

    我已经在 Windows 7 的 Qt5 1 上开发了一个应用程序 现在我想分发它 由于我使用了 MINGW 编译器 因此无法静态构建它 我使用dependency walker找出所有dll并打包 当我在未安装 QT 开发环境的计算机上运
  • 通过对 XmlHttpRequest (REST) 的响应在 QML 中显示图像

    我需要从 REST API 调用中获取 jpeg 图像 我使用 XMLHttpRequest 因为请求需要身份验证标头 即我不能只创建一个图像并将源设置为带有 user passwd url 的 URL 我认为我可以通过将 REST 数据设
  • QT 中的应用程序->处理消息?

    在 Borland 6 中 我经常使用它来解除程序操作的卡住 Application gt Processmessages 现在 对于 QT 4 8 1 我在这个外国 对我来说 QT 文档中找不到 谁能帮我 在 Qt 中 您可以使用静态函数
  • 如何恢复 QSS 属性的默认系统值?

    如果父级之一将其样式表设置为 Qt QSS 会传播给子级color red 它的所有子级都将应用此样式表 如果你明确设置QLabel color red 那么只有 QLabel 子项会受到关注 如果子项设置自己的值 则可以覆盖子项的样式表c
  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON

随机推荐

  • 简易JDBC连接数据库

    简易JDBC连接数据库 1 导入jar包 首先在项目中创建lib文件包 在lib文件包中粘贴MySQL的jar包 将lib包添加为库 2 注册驱动 在类中注册驱动 Class forName com mysql jdbc Driver 提示
  • (Redis) 跳跃表(skiplist)实现原理

    跳跃表简介 跳跃表 skiplist 是一种随机化的数据 由 William Pugh 在论文 Skip lists a probabilistic alternative to balanced trees 中提出 跳跃表以有序的方式在层
  • PHP curl 获取返回的内容和头部信息示例

    请求示例 function curl res string url string data array header is post false is post false url 请求地址 token token 头部 header Co
  • WPA渗透-pyrit:GPU加速_Hash-table

    WPA渗透 pyrit GPU加速 Hash table 1 pyrit工具介绍 pyrit是一款开源且完全免费的软件 任何人都可以检查 复制或修改它 它在各种平台上编译和执行 包括FreeBSD MacOS X和Linux作为操作系统以及
  • 大学生数学竞赛习题精讲_陈兆斗

    大学生数学竞赛习题精讲 陈兆斗 链接 https pan baidu com s 1ctyZqmD 6VFgILBM0DiTcg 提取码 i76s 复制这段内容后打开百度网盘手机App 操作更方便哦
  • mysql用事务实现更新数据

    前言 在手动批量更新正式环境数据库时 建议使用事物进行更新 避免更错数据 造成不必要的麻烦 现表中有三条数据 使用事物批量将name字段为mgx phone字段为17837107346 所有数据中的address字段更新成河北唐山 开始事物
  • moco接口框架介绍

    moco接口框架介绍 Moco 是一个搭建模拟服务器的工具 其支持 API 和独立运行两种方式 前者通常是在 junit testng等测试框架中使用 后者则是通过运行一个 jar 包开启服务 在maven中央仓库中 moco有三个版本 分
  • <Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结)

    Linux开发 系统移植 之 linux内核移植过程详细记录 第二部分完结 前面 第一部分讲解了 NXP官方原厂的Linux直接编译下载到开发板的操作过程 及测试效果 以及过程中设计使用的一些辅助工具 从第一部分 可以熟悉整个Linux编译
  • JSON 语法规则详解

    JSON 的语法规则十分简单 无论用何种方法总结都只有数条而已 它参考了 C 语言家族的一些习惯 学习起来并不会感到陌生 回顾JSON 的五点语法 1 数组 Array 用方括号 表示 2 对象 Object 用大括号 表示 3 名称 值对
  • 抽象方法与抽象类

    没有方法体的方法就是抽象方法 如果一个类中有抽象方法则这个类就是抽象类 public abstract class Abs public abstract void shoot 抽象方法 public abstract void eat p
  • Scrapy 爬虫笔记

    目录 概述 开始 启动项目 爬虫初始化 处理响应 回调函数的参数 图片下载 未完待续 相关资源 概述 本文记录了个人使用 Scrapy 爬取某网站产品信息 包含图片下载 的整个过程 也可以作为一篇 Scrapy 实战教学博客 首先从 All
  • 网络安全-自学笔记

    目录 相关网站推荐 WEB 应用 安全 学习路线 推荐 书籍 网站 在线靶场 基础 XSS攻击 CSRF漏洞 劫持攻击 点击劫持 SSRF漏洞 文件包含漏洞 文件上传漏洞 XXE漏洞 WebShell 解析安全 RCE漏洞 SQL注入漏洞
  • 网络爬虫是什么?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 互联网诞生之初 是为了让人们更容易的分享数据 交流通讯 互联网是桥梁 连接了世界各地的人们 网站的点击 浏览都是人为的 与你聊天的也是活生生的人 然而 随着技术的发展 人们
  • Java 实现区块链

    Java 是一种流行的面向对象的编程语言 它可以用来实现区块链 在实现区块链时 通常需要考虑以下几个方面 区块的数据结构 区块通常包含一些数据 如交易信息 以及一些元数据 如区块的哈希值和时间戳 你可以使用 Java 中的数据结构 如类 对
  • 【C++】STL —— list的基本使用

    目录 一 list容器的简介 二 list容器常用的接口 1 list初始化操作 1 构造函数 编辑 2 析构函数 3 赋值重载函数 2 list容量相关的函数 3 list的迭代器 4 list的增删查改 一 list容器的简介 1 li
  • 使用STM32CubeMX和STM32CubeIDE的常见问题和注意事项

    STM32CubeMX和STM32CubeIDE是ST公司的STM32Cube生态系统中最重要和最常用的2个软件 使用这2个免费软件可以高效地进行STM32系统的开发 CubeMX用于对一个STM32器件进行可视化的配置 然后生成CubeI
  • git 解决冲突之 theirs & ours

    git merge 从feature分支合并到master分支 git checkout master git merge feature Auto merging Document CONFLICT content Merge confl
  • echarts--3D效果柱状图

    echarts二维柱状图做3D效果 先看下效果 废话不多说 直接上代码 div class box echart div initBarEchart 柱状图 let option bar this setOption let array n
  • 【sqli-labs】 less37 POST- Bypass MYSQL_real_escape_string (POST型绕过MYSQL_real_escape_string的注入)...

    POST版本的less36 uname 1 passwd 1 df or 1 转载于 https www cnblogs com omnis p 8384536 html
  • Qt

    Qt QListView QListWidget QTableView QTableWidget的使用示例及区别 目录 Qt QListView QListWidget QTableView QTableWidget的使用示例及区别 1 简