QTableWidget使用

news2024/11/22 16:06:14

QTableWidget介绍

QTableWidget是Qt框架中的一个表格控件,用于显示二维表格数据。它是基于QTableView和QStandardItemModel的封装,提供了更简单的接口和功能。

QTableWidget主要具有以下特点:

  1. 二维数据表示:QTableWidget以行和列的组合形式呈现表格数据,每个格子称为一个单元格。可以通过指定行数和列数来创建一个空的表格,并动态添加、删除行列。

  2. 单元格编辑:QTableWidget可以直接在表格中进行单元格的编辑操作。可以通过设置单元格的编辑属性来控制哪些单元格可编辑,哪些单元格只读。

  3. 表头管理:QTableWidget支持自定义表头,在水平方向和垂直方向上可以设置不同的表头标题。默认情况下,QTableWidget会根据数据模型自动生成默认表头。

  4. 可选行选择模式:QTableWidget提供多种选择模式,可以选择一行或多行数据。可以通过设置选择行为和选择模式来实现不同的选择方式。

  5. 排序与排序指示器:QTableWidget支持按照某一列的数据进行升序或降序排序,并在表头显示排序指示器。

  6. 样式定制:可以通过设置样式表来改变QTableWidget的外观,包括单元格颜色、字体、边框等。

  7. 信号与槽机制:QTableWidget发出多种信号,如单元格点击、双击、选择变化等,可以通过连接这些信号与自定义的槽函数实现特定的响应。

总的来说,QTableWidget是一个功能强大且灵活的表格控件,适用于在界面中展示和编辑二维表格数据。无论是简单的数据展示还是复杂的数据交互,QTableWidget都能提供便捷且高效的解决方案。

QTableWidget接口

以下是QTableWidget常用的一些接口:

  1. setRowCount(int count):设置表格的行数。
  2. setColumnCount(int count):设置表格的列数。
  3. rowCount():返回表格的行数。
  4. columnCount():返回表格的列数。
  5. insertRow(int row):在指定的行插入一行。
  6. removeRow(int row):移除指定的行。
  7. insertColumn(int column):在指定的列插入一列。
  8. removeColumn(int column):移除指定的列。
  9. clear():清空表格的所有内容。
  10. setItem(int row, int column, QTableWidgetItem *item):在指定的单元格设置一个QTableWidgetItem对象。
  11. item(int row, int column):返回指定单元格的QTableWidgetItem对象。
  12. setHorizontalHeaderLabels(const QStringList &labels):设置水平方向的表头标签。
  13. setVerticalHeaderLabels(const QStringList &labels):设置垂直方向的表头标签。
  14. horizontalHeaderItem(int column):返回指定列的水平表头项。
  15. verticalHeaderItem(int row):返回指定行的垂直表头项。
  16. setEditTriggers(EditTriggers triggers):设置表格的编辑触发方式,如单击、双击等。
  17. setSelectionMode(SelectionMode mode):设置表格的选择模式,如单选、多选等。
  18. currentRow():返回当前选择的行号。
  19. currentColumn():返回当前选择的列号。
  20. selectedItems():返回当前选择的所有单元格的QTableWidgetItem对象列表。
  21. sortItems(int column, Qt::SortOrder order):按照指定列的数据对表格进行排序。
  22. setSortingEnabled(bool enable):设置是否启用排序功能。
  23. setStyleSheet(const QString &styleSheet):设置表格的样式表。
  24. setCellWidget(int row, int column, QWidget *widget):在指定的单元格设置一个自定义的QWidget部件。
  25. cellWidget(int row, int column):返回指定单元格中的自定义QWidget部件。

请注意,这只是QTableWidget的一部分接口,还有更多其他接口可以用于更高级的操作和定制化需求。

QTableWidget的性能问题

实际上,QTableWidget和QTableView都是Qt框架提供的用于显示表格数据的类,它们在不同的场景下可能具有不同的性能表现。一般情况下,QTableView比QTableWidget具有更好的性能,原因如下:

  1. 数据模型的选择:QTableWidget使用的是QTableWidgetItem作为数据模型,这是一种基于QTableWidget的数据结构。而QTableView使用的是QAbstractTableModel等更通用的数据模型。相对而言,QAbstractTableModel可以更好地支持大量数据和高速数据更新,因为它提供了更灵活的数据模型。

  2. 内部数据结构:QTableWidget内部使用了QTableWidgetItem来表示单元格数据,而QTableView使用了与数据模型相匹配的数据结构。QTableWidgetItem是一种较为简单的数据结构,无法提供高效的数据操作和访问。

  3. 重新绘制的开销:由于QTableWidget是基于QWidget的,每次进行重绘时,它需要重新绘制整个表格,而QTableView可以只绘制可见区域,从而减少了绘制的开销。

  4. 灵活性和扩展性:使用QTableView可以更方便地自定义和扩展,例如通过自定义数据模型、委托或代理来实现特殊的显示和交互需求。而QTableWidget的功能和外观相对固定,定制性较低。

请注意,这种性能差异通常是在处理大量数据或高频更新数据时才会明显体现出来。对于小型数据集和简单的界面需求,两者的性能差异可能并不明显。如果您需要处理大量数据或需要更高级的功能和性能优化,建议使用QTableView以获得更好的性能和灵活性

QTableWidget不支持设置代理模型

在QTableWidget中,没有内置的过滤和排序功能。不过,您可以通过编写自定义的代码实现这些功能。以下是一些思路:

  1. 过滤:可以通过迭代遍历QTableWidget中的数据行,并根据某些条件进行筛选,然后隐藏或删除不符合条件的行。例如,可以使用item(row, column)获取单元格对象,然后使用text()获取文本值进行比较。

  2. 排序:可以使用QTableWidget的sortItems()函数对特定列的数据进行排序。您可以将此函数与自定义的排序算法结合使用,根据需要的排序顺序(升序或降序)进行调整。

需要注意的是,这些操作都需要手动实现,并且可能会涉及到大量的数据复制和重新排列,所以性能可能会受到一定的影响。如果对于过滤和排序有更高的性能要求,推荐使用QTableView和QSortFilterProxyModel来实现这些功能。

注意事项

在使用QTableWidget时,请注意以下几点:

  1. 数据操作:通过QTableWidget添加、删除和修改数据时,要确保操作的数据与表格的行列索引一致。特别是在使用setItem()函数设置单元格数据时,要注意指定正确的行列索引值。

  2. 行列数设置:在使用QTableWidget之前,需要设置表格的行数和列数。可以使用setRowCount()setColumnCount()函数进行设置,确保与实际数据的行列数一致。

  3. 单元格属性:可以使用setItem()函数设置单元格的数据,还可以使用item(row, column)函数获取单元格对象,并对其进行属性设置,如文本颜色、背景色等。

  4. 选择模式:通过设置setSelectionBehavior()setSelectionMode()函数可以定义表格的选择性行为和模式。例如,可以设置为选择整行或整列,或者设置为多选或单选模式。

  5. 表头设置:可以使用setHorizontalHeaderLabels()setVerticalHeaderLabels()函数设置表格的水平和垂直表头文本。

  6. 事件处理:可以通过重写keyPressEvent()等函数来处理键盘事件,或者通过重写mousePressEvent()等函数来处理鼠标事件。这些事件处理函数可以用于实现自定义的交互逻辑。

  7. 布局管理:将QTableWidget嵌入到布局管理器中,以便进行自适应布局和窗口调整。

  8. 性能考虑:如果处理大量数据或需要频繁更新表格,请考虑使用更高级的数据模型(如QAbstractTableModel)和优化策略,以提高性能。

请记住,在使用QTableWidget时要遵循所需数据的正确行列索引,并根据实际需求进行适当的设置和处理。通过合理使用QTableWidget的属性和函数,可以轻松创建和管理表格数据。

代码示例

显示表格数据的基本思路是:

  1. 创建一个QTableWidget对象,并设置表格的行数和列数。可以使用setRowCount()setColumnCount()函数进行设置。

  2. 使用setItem(row, column, item)函数将数据逐个添加到表格中。其中,row表示行索引,column表示列索引,item为QTableWidgetItem对象,用于设置单元格的数据和属性。

  3. 可以使用setHorizontalHeaderLabels()setVerticalHeaderLabels()函数设置表格的水平和垂直表头文本。

  4. 根据需要,可以通过调用setEditTriggers()函数来设置表格的编辑触发器。例如,可以禁止编辑、只允许单元格内编辑、或者只允许行或列编辑。

  5. 可以使用setSelectionMode()函数设置表格的选择模式,例如设置为单选、多选或扩展选择模式。

  6. 选择合适的布局管理器,将QTableWidget添加到布局中,以便根据窗口大小自动调整表格大小和布局。

  7. 最后,将QTableWidget添加到主窗口或其他适当的窗口部件中进行显示。

通过上述步骤,可以创建并显示带有数据的表格。根据需要,还可以使用其他相关的函数和属性对表格进行进一步的定制和操作。

missiondata.h

#ifndef MISSIONDATA_H
#define MISSIONDATA_H

#include <QObject>
#include <QMap>

struct MissionHeadInfo
{
    quint32 missionFlag;//标识,16进制显示
    QString missionCode; //代号
    QString missionName; //名称

    MissionHeadInfo()
    {
        missionFlag = 0x00;//标识,16进制显示
        missionCode = ""; //代号
        missionName = ""; //名称
    }
};



class MissionData : public QObject
{
    Q_OBJECT
public:
    explicit MissionData(QObject *parent = nullptr);

    static MissionData * getInstance()
    {
        static MissionData instance;
        return &instance;
    }

    //获取所有的代号
    QStringList getCodes();

    //获取头信息
    MissionHeadInfo getMissionHeadInfo(const QString &code, bool &isOK);

private:
    QMap<QString, MissionHeadInfo> map_MissionHeadInfo;//头信息字典

    void initMap();

signals:

public slots:
};

#endif // MISSIONDATA_H

missiondata.cpp

#include "missiondata.h"

MissionData::MissionData(QObject *parent) : QObject(parent)
{
    initMap();
}

QStringList MissionData::getCodes()
{
    return map_MissionHeadInfo.keys();
}

MissionHeadInfo MissionData::getMissionHeadInfo(const QString &code, bool &isOK)
{
    if(map_MissionHeadInfo.contains(code))
    {
        isOK = true;
        return map_MissionHeadInfo.value(code);
    }

    isOK = false;

    return MissionHeadInfo();
}


void MissionData::initMap()
{
    //创建15个目标信息
    for(int j=0; j<3; j++)
    {
        for(int i=0; i<5; i++)
        {
            static int totalNum = 0;
            totalNum++;

            int num = i+1;
            quint32 missionFlag = totalNum;//标识,16进制显示
            QString missionCode = QString("%1%2_%3").arg(j).arg(j).arg(num); //代号
            QString missionName = QString("第%1个目标").arg(totalNum); //名称

            MissionHeadInfo info;
            info.missionFlag = missionFlag;
            info.missionCode = missionCode;
            info.missionName = missionName;

            map_MissionHeadInfo.insert(missionCode,info);
        }
    }
}

tablewidgetdialog.h

#ifndef TABLEWIDGETDIALOG_H
#define TABLEWIDGETDIALOG_H

#include <QDialog>
#include <QTableWidget>
#include <QSortFilterProxyModel>

namespace Ui {
class TableWidgetDialog;
}

class TableWidgetDialog : public QDialog
{
    Q_OBJECT

public:
    explicit TableWidgetDialog(QWidget *parent = 0);
    ~TableWidgetDialog();

private slots:
    void onTableWidgetClicked(const QModelIndex &index);

private:
    Ui::TableWidgetDialog *ui;
    QTableWidget *tableWidget = nullptr;
    QSortFilterProxyModel *proxyModel = nullptr;

    void initTableWidget();

    void updateMissionItem();
};

#endif // TABLEWIDGETDIALOG_H

tablewidgetdialog.cpp

#include "tablewidgetdialog.h"
#include "ui_tablewidgetdialog.h"
#include "missiondata.h"
#include <QDebug>

TableWidgetDialog::TableWidgetDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TableWidgetDialog)
{
    ui->setupUi(this);
    this->setFixedSize(600,800);
    MissionData::getInstance();//数据初始化
    ui->widget->setFixedSize(600,700);

    initTableWidget();
    updateMissionItem();
}

TableWidgetDialog::~TableWidgetDialog()
{
    delete ui;
}

void TableWidgetDialog::initTableWidget()
{
    // 创建一个QTableWidget对象,并设置行数和列数
    tableWidget = new QTableWidget(ui->widget);
    tableWidget->setColumnCount(4);
    tableWidget->setFixedSize(ui->widget->size());
    tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置单元格不可编辑
    //设置水平表头的颜色
    tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(179,208,230);border:1px solid rgb(94,152,205)}" );

    // 设置表头
    tableWidget->setHorizontalHeaderLabels(QStringList() <<"序号"<< "标识" << "代号" << "名称");
    tableWidget->verticalHeader()->setVisible(false);

    connect(tableWidget, &QAbstractItemView::clicked, this, &TableWidgetDialog::onTableWidgetClicked);
}

void TableWidgetDialog::onTableWidgetClicked(const QModelIndex &index)
{
    if (index.isValid()) {

        int clickedRow = index.row();

        QString res = QString("第%1行:").arg(clickedRow+1);
        for(int i=0;i<4;++i)
        {
            QModelIndex filterModelIndex = tableWidget->model()->index(clickedRow, i);
            QString str = tableWidget->model()->data(filterModelIndex).toString();

            res += str;
            res += "-";
        }

        qDebug()<<res;
    }
}

void TableWidgetDialog::updateMissionItem()
{
    MissionData *pMissionData = MissionData::getInstance();
    QStringList codeList =pMissionData->getCodes();

    // 初始化表格数据
    int row = 0;
    tableWidget->setRowCount(codeList.count());

    for(int i = 0; i < tableWidget->rowCount(); ++i) {
        bool isOK = false;
        MissionHeadInfo info = pMissionData->getMissionHeadInfo(codeList.at(i),isOK);

        QTableWidgetItem* itemNum = new QTableWidgetItem(QString::number(row+1)); // 序号
        QTableWidgetItem* itemFlag = new QTableWidgetItem(QString::number(info.missionFlag, 16).toUpper()); // 目标标识
        QTableWidgetItem* itemCode = new QTableWidgetItem(info.missionCode); // 目标代号
        QTableWidgetItem* itemName = new QTableWidgetItem(info.missionName); // 目标名称

        // 将单元格添加到表格中
        tableWidget->setItem(row, 0, itemNum);
        tableWidget->setItem(row, 1, itemFlag);
        tableWidget->setItem(row, 2, itemCode);
        tableWidget->setItem(row, 3, itemName);

        row++;
    }
}

运行结果:

 依次点击每一行:

 

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

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

相关文章

ruoyi-cloud 服务间的调用,OpenFeign的使用

1. 在公共包内添加实体类 2.在 com.ruoyi.common.core.constant 添加如下代码 package com.ruoyi.common.core.constant; public class ServiceNameConstants {/*** 药材服务的serviceid &#xff08;生产者 nacos内注册应用名&#xff09;*/public static final String DRUG_…

AI极客日报0818 - AI帮助中风患者重新行走

&#x1f440;AI 日报合集 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 有了人工智能&#xff0c;似乎没有什么是我们解决不了的。人工智能的一项新突破让瘫痪的中风幸存者能够通过“智能裤子”再次行走。让我们深入了解…… 今日要点: **&#x1f456;惊艳&#xff01…

QT实现天气预报

1. MainWindow类设计的成员变量和方法 public: MainWindow(QWidget* parent nullptr); ~MainWindow(); protected: 形成文本菜单来用来右键关闭窗口 void contextMenuEvent(QContextMenuEvent* event); 鼠标被点击之后此事件被调用 void mousePressEvent(QMouseEv…

系统架构设计师之软件架构风格

系统架构设计师之软件架构风格

学习心得02:QT6

以前也多少接触过QT。只是因为工作并不需要深入了解&#xff0c;所以是简单试用。现在有时间了&#xff0c;专门买了本书&#xff0c;从头到尾看了一番。因为是补充知识&#xff0c;所以范例、操作也没有实际操作。 QT使用的语言是C。比较特殊的地方是信号和槽。

11----图片

在Markdown中&#xff0c;可以通过简单的语法插入图片。 一、普通的添加图片&#xff1a;![图片描述](图片链接) 下面的代码&#xff0c;在上一节生成超链接的代码&#xff08;链接到网站&#xff09;前面添加一个感叹号(!)&#xff0c;同时把链接换成图片地址。 其中&#xf…

[PCIE 5.0] 第5代PCIe SSD 发展前沿(2023 Q2 更新)

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,禁止转载,如有误请留言。 1 什么是 PCIe 5.0? 第 5 代快速周边组件互连称为 PCI Express 5.0。它也称为第 5 代 PCIe、PCIe 5、PCI v5 或简称为 PCIe 5.0。 2 PCIE5.0 速度 2.1 PCIE5.0 极限速度 从PCIe 4.0更新到…

【NX】NX二次开发BlockUI集列表的详细使用步骤

最近使用NX二次开发&#xff0c;需要用到集列表&#xff0c;也就是SetList这个控件&#xff0c;然而网上相关的资料和范例实在是太少&#xff0c;有幸找到《NX二次开发-BlockUI集列表的使用技巧》和《UG&#xff08;NX&#xff09;二次开发 BlockUI 集列表使用方法》&#xff0…

vite+vue3 自动按需导入element-plus

安装element npm install element-plus自动导入 安装自动导入的插件: npm install -D unplugin-vue-components unplugin-auto-import配置 vite.config.js文件&#xff1a; import { defineConfig } from vite import AutoImport from unplugin-auto-import/vite import C…

Axios使用CancelToken取消重复请求

处理重复请求&#xff1a;没有响应完成的请求&#xff0c;再去请求一个相同的请求&#xff0c;会把之前的请求取消掉 新增一个cancelRequest.js文件 import axios from "axios" const cancelTokens {}export const addPending (config) > {const requestKey …

陕西科技大学改考408!附考情分析

改考信息 8月14日&#xff0c;陕西科技大学公布了2024年硕士研究生招生目录&#xff08;初稿&#xff09;&#xff0c;其中不难发现083500软件工程初试专业课由819数据结构改为408计算机学科专业基础 图片&#xff1a;陕西科技大学24专业目录-软件工程学硕 https://yjszs.sus…

Vue组件库 (一):Element常用组件

Element基于Vue2.0的桌面端组件库 组件&#xff1a;组成网页的部件。例如超链接、图片、按钮等。 一、环境配置 1、下载element 在vscode工程终端下下载。一定要注意&#xff1a;是在工程下安装&#xff01; npm install element -ui2.15.3 出现以下问题&#xff1a; 经判…

基于Spring Boot的机场VIP客户管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的机场VIP客户管理系统的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java s…

泰迪大数据挖掘建模平台功能特色介绍

大数据挖掘建模平台面相高校、企业级别用户快速进行数据处理的建模工具。 大数据挖掘建模平台介绍 平台底层算法基于R语言、Python、Spark等引擎&#xff0c;使用JAVA语言开发&#xff0c;采用 B/S 结构&#xff0c;用户无需下载客户端&#xff0c;可直接通过浏览器进行…

水库信息化综合管理系统解决方案

一、系统概述 水库综合信息化管理系统主要对水库坝址以上流域、工程本身、下游受益区及相关区的实时气象、水情、工情、旱情、洪涝灾情&#xff0c;以及社会经济和自然环境等信息自动化实时采集&#xff0c;构建一站式的水库信息公共平台&#xff0c;通过多功能完善的系统软件和…

C# Windows登录界面进行截图,控制鼠标键盘等操作实现(一)

首先常规的账户进程是没办法获取登录界面的信息的&#xff0c;因为登录界面已经不在某个账户下了&#xff0c;登录界面显示了每一个账户的切换。所以得使用System权限的进程。 那么Windows系统究竟是怎么将登录界面与用户桌面隔离开的呢&#xff1f;首先先通过一些Windows操作系…

Linux系统编程4(进程信号详解)

你知道为什么当程序中出现除0就会引发程序崩溃退出吗&#xff1f;你知道为何在Linux中输入kill -9 pid 就能杀死进程id为pid的进程吗&#xff1f;这篇文章将详细探讨解答这些问题&#xff0c;文章内容比较长&#xff0c;大家可以收藏慢慢看 什么是信号 在进程间通信这篇文章中…

一百五十九、Kettle——Kettle9.2通过配置Hadoop clusters连接Hadoop3.1.3(踩坑亲测、附流程截图)

一、目的 由于kettle的任务需要用到Hadoop&#xff08;HDFS&#xff09;&#xff0c;所以就要连接Hadoop服务。 之前使用的是kettle9.3&#xff0c;由于在kettle新官网以及博客百度等渠道实在找不到shims的驱动包&#xff0c;无奈换成了kettle9.2&#xff0c;kettle9.2的安装…

【Apollo学习笔记】—— Planning模块

前言 本文记录学习planning模块时的一些笔记&#xff0c;总体流程参照https://zhuanlan.zhihu.com/p/61982682中的流程图&#xff0c;如上图所示。 planning_component modules/planning/planning_component.cc PlanningComponent::Init部分首先完成规划模式的选择&#xff…

ArcGIS 利用cartogram插件制作变形地图

成果图 注&#xff1a;本图数据并不完全对&#xff0c;只做为测试用例 操作 首先需要下载一个插件cartogram 下载地址在这里 https://www.arcgis.com/home/item.html?idd348614c97264ae19b0311019a5f2276 下载完毕之后解压将Cartograms\HelpFiles下的所有文件复制到ArcGIS…