qt5-入门-QTableWidget-嵌套的表格

embedded/2024/10/18 9:24:25/

参考:
C++ GUI Programming with Qt 4, Second Edition

本地环境:
win10专业版,64位,Qt5.12

所有代码已经跑通。

仅供个人记录、积累。


目录

  • 基础版
    • 效果
    • 实现
      • 如何获取QTableWidget的默认行高?
      • 代码
  • 无边框版
    • 效果
    • 实现

基础版

效果

在这里插入图片描述

实现

如何获取QTableWidget的默认行高?

double getDefaultRowHeight(QTableWidget* table) {QFontMetrics fontMetrics(table->font());return fontMetrics.height() * 1.25; // 一般是字体大小的1.25倍
}

代码

myTableWidget->setRowCount(nrows); // 设置一下行数
// 设置整个表格可以排序
myTableWidget->setSortingEnabled(true);
double defaultRowHeight = getDefaultRowHeight(myTableWidget);
// 循环,填充每一行. dfo是包含信息的一个对象
for (int i = 0; i < nrows; i++) {// 第一列,先创建内嵌的表格QTableWidget *nestedTable = new QTableWidget;nestedTable->setRowCount(xxx);nestedTable->setColumnCount(3);// 不显示表头和列头nestedTable->horizontalHeader()->setVisible(false);nestedTable->verticalHeader()->setVisible(false);// 这句不知道为啥不能无框线//nestedTable->setStyleSheet("QTableWidget { border: none; }");// fill nameQTableWidgetItem *name = new QTableWidgetItem();// 设置字体name->setTextColor(QColor(Qt::darkBlue));name->setText(XXX);// 填充第一行nestedTable->setItem(0, 0, name);int kc = 1;// 循环填充细节for (QHash<QString, QString>::iterator it = Details.begin();it != Details.end(); it ++) {QTableWidgetItem *key = new QTableWidgetItem();QFont myfont;myfont.setBold(true);  // 加粗key->setFont(myfont);key->setText(it.key());// 填充内容nestedTable->setItem(kc, 0, key);nestedTable->setItem(kc, 1, new QTableWidgetItem("="));QTableWidgetItem *val = new QTableWidgetItem(it.value());nestedTable->setItem(kc, 2, val);kc ++; // 继续创建下一行}// 设置列宽nestedTable->setColumnWidth(1, 10);nestedTable->setColumnWidth(2, 300);// 为了占满单元格nestedTable->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);myTableWidget->setCellWidget(i, 0, nestedTable);// 设置行高myTableWidget->setRowHeight(i, static_cast<int>((kc + 2) * defaultRowHeight));myTableWidget->setColumnWidth(0, 400);// positionQTableWidgetItem *pitem = new QTableWidgetItem(xxx);myTableWidget->setItem(i, 1, pitem);// 其他列内容填充...}

现在还存在单元格里长字符串重叠的问题,可以通过调整行高改善。不过我的项目最后没用这个方案,所以没继续优化。

无边框版

效果

在这里插入图片描述

实现

先写模型。其中数据中的key做列名,val做内容。

class FeatureTableModel : public QAbstractTableModel
{Q_OBJECT
public:explicit FeatureTableModel(QObject* parent = nullptr): QAbstractTableModel(parent){}void setData(QMap<QString, QString> other, QString name) {// 刷新数据beginResetModel();this->m_data = other;this->name = name;endResetModel();}QMap<QString, QString> getData() {return  this->m_data;}QString getName() {return this->name;}QVariant headerData(int section, Qt::Orientation orientation, int role) const override{if (role == Qt::DisplayRole){if (orientation == Qt::Horizontal){return QVariant(this->name); // 返回Name}else if (orientation == Qt::Vertical){return QVariant((this->m_data.begin() + section).key());}}if (role == Qt::TextAlignmentRole) {return int(Qt::AlignLeft | Qt::AlignVCenter);}return QAbstractTableModel::headerData(section, orientation, role);}int rowCount(const QModelIndex& parent = QModelIndex()) const override{return m_data.size();}int columnCount(const QModelIndex& parent = QModelIndex()) const override{return 1;}QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override{// index不合法返回空的if (!index.isValid())return QVariant();if (role == Qt::TextAlignmentRole) {return int(Qt::AlignLeft | Qt::AlignVCenter);} else if (role == Qt::DisplayRole) {return (m_data.begin() + index.row()).value();}return QVariant();}Qt::ItemFlags flags(const QModelIndex& index) const override{if (!index.isValid())return Qt::NoItemFlags;return Qt::ItemIsEditable | QAbstractTableModel::flags(index);}bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override{if (index.isValid() && role == Qt::EditRole) {//m_data.replace(index.row(), value.toString());//emit dataChanged(index, index);return true;}return false;}private:QMap<QString,QString> m_data; // key-valQString name;
};

然后写使用部分:

// 总表
QTableWidget *table = new QTableWidget;
table->setRowCount(2);
table->setColumnCount(2);QTableView *nestedTableView = new QTableView;
// 模型
FeatureTableModel* nestedModel = new FeatureTableModel;
QMap<QString, QString> map = {{"a","1"}, {"b", "2"}, {"c", "3"}};
nestedModel->setData(map, "Name");
nestedTableView->setModel(nestedModel);
// 去掉框线
nestedTableView->setShowGrid(false);
// 设置表头的格式
nestedTableView->horizontalHeader()->setStyleSheet("text-align:left; color:blue;");
// 设置表格自适应内容大小
nestedTableView->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);// 设置自适应内容边界
//nestedTableView->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));// 动态设置列宽和行高
nestedTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
nestedTableView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);// 自动调整行高和列宽
nestedTableView->resizeRowsToContents();
nestedTableView->resizeColumnsToContents();// 嵌套的表格加入总表
table->setCellWidget(0, 0, nestedTableView);// 填充其他内容
table->setItem(0, 1, new QTableWidgetItem("aaaa"));
table->setItem(1, 0, new QTableWidgetItem("aaaa"));
table->setItem(1, 1, new QTableWidgetItem("aaaa"));// table也要自动调整,不然扁扁的不好看
table->resizeRowsToContents();
table->resizeColumnsToContents();table->show();

http://www.ppmy.cn/embedded/35821.html

相关文章

最简单的自动化爬虫工具--Playwright

Playwright Playwright是一款强大的自动化库&#xff0c;提供了一种简便易用、高性能的网页自动化解决方案。它支持同步和异步两种操作方式&#xff0c;用户无需为不同浏览器单独下载驱动程序&#xff0c;因为Playwright内置了对Chrome、Firefox、Safari等多种浏览器的支持。此…

Windows 下启动 jar 后隐藏cmd 窗口

编写BAT脚本文件如下 方法一 echo off # 获取当前执行脚本的目录 set jarPath%~dp0 # 使用 javaw 启动一个jar start javaw -jar %jarPath%xxx.jar方法二 echo off # 获取当前执行脚本的目录 set jarPath%~dp0 # 使用vb脚本方式处理 cmd 窗口 %1 mshta vbscript:CreateObjec…

产业园物业满意度调研问卷设计

本文由群狼调研&#xff08;长沙物业竞争对手分析&#xff09;出品&#xff0c;欢迎转载&#xff0c;请注明出处。设计产业园物业满意度调研问卷时&#xff0c;可以考虑以下要点&#xff1a; 1.个人信息&#xff1a;收集参与者的基本信息&#xff0c;如姓名、职务、所在企业等&…

互斥量理论基础

文章目录 一、互斥量理论基础 一、互斥量理论基础 在多任务系统中&#xff0c;任务A正在使用某个资源&#xff0c;还没用完的情况下任务B也来使用的话&#xff0c;就会出问题。这时就需要互斥量&#xff08;互斥锁&#xff09;&#xff0c;使用过程如下&#xff1a; 互斥量初始…

3.栈和队列(汇总版)

目录 1.栈&#xff08;一端插和删&#xff09; 2.队列&#xff08;一端插另一段删&#xff09; 2.1队列的概念及结构 2.2 队列的实现 队列的接口 1.初始化队列 2.销毁队列 3.插入元素 4.出队列&#xff08;头删&#xff09; 5.访问对头 6.访问队尾 7.判断队列是否为…

智慧校园整体解决方案

智慧校园囊括了校园事务的各个方面&#xff0c;同时&#xff0c;智慧校园又是所有相关子系统的数据输出与枢纽。可以看出&#xff0c;智慧校园是一个大而全的系统。鉴于此&#xff0c;智慧校园的模块众多&#xff0c;本文将智慧校园的所有模块做出大致梳理&#xff0c;以完整支…

如何8步完成hadoop单机安装

前言 Hadoop是一个开源框架&#xff0c;用于存储和处理大规模数据集。 系统要求 Ubuntu 20.044GB&#xff08;建议8GB&#xff09;hadoop-3.3.6 步骤1&#xff1a;更新系统 打开终端并输入以下命令来更新您的系统&#xff1a; apt update 步骤2&#xff1a;安装Java Had…

AcWing 827. 双链表——算法基础课题解

AcWing 827. 双链表 题目描述 实现一个双链表&#xff0c;双链表初始为空&#xff0c;支持 5 种操作&#xff1a; 在最左侧插入一个数&#xff1b;在最右侧插入一个数&#xff1b;将第 k 个插入的数删除&#xff1b;在第 k 个插入的数左侧插入一个数&#xff1b;在第 k 个插…