QTableWidget使用代理绘制分行显示

在这里插入代码片# 创建主窗口类:
使用 QTableWidget 作为核心控件。
设置表头及行列信息。

自定义代理:

继承 QStyledItemDelegate,实现代理模式。
重写 paint 和 sizeHint 方法,支持多行文本绘制。
设置行高以适应多行显示。
第二行内容以红色字体显示。

文件划分:

主程序入口 main.cpp。
主窗口类定义 mainwindow.h 和 mainwindow.cpp。
自定义代理类 multilineitemdelegate.h 和 multilineitemdelegate.cpp

案例展示

在这里插入图片描述

据提功能代码

void MultiLineItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    painter->save();

    // 获取多行文本
    QString text = index.data(Qt::DisplayRole).toString();
    QStringList lines = text.split('\n'); // 按行分割

    // 绘制背景
    if (option.state & QStyle::State_Selected) {
        painter->fillRect(option.rect, option.palette.highlight());
    } else {
        painter->fillRect(option.rect, option.palette.base());
    }

    // 设置文本绘制参数
    QFontMetrics fm(option.font);
    int lineHeight = fm.height();
    int y = option.rect.top() + (option.rect.height() - lineHeight * lines.size()) / 2;

    // 绘制多行文本
    for (int i = 0; i < lines.size(); ++i) {
        // 第一行正常绘制
        if (i == 0) {
            painter->setPen(option.palette.color(QPalette::Text));
        }
        // 第二行使用红色字体
        else if (i == 1) {
            painter->setPen(Qt::red);
        }

        painter->drawText(option.rect.left() + 5, y + (i + 1) * lineHeight, lines[i]);
    }

    painter->restore();
}

详细代码如下:

main.cpp

#include "mainwindow.h"
#include <QApplication>

// 主程序入口
int main(int argc, char *argv[])
{
    QApplication a(argc, argv); // 创建应用程序对象
    MainWindow w;              // 创建主窗口对象
    w.show();                  // 显示主窗口
    return a.exec();           // 进入应用程序事件循环
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTableWidget>
#include "multilineitemdelegate.h"

// 主窗口类,包含一个 QTableWidget
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QTableWidget *tableWidget; // 表格控件指针
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // 创建表格控件
    tableWidget = new QTableWidget(this);
    tableWidget->setColumnCount(6); // 设置列数
    tableWidget->setRowCount(10);   // 设置行数

    // 设置表头
    QStringList headers = {"编号", "科目类型", "人员名称", "原班级", "交接班级", "流程"};
    tableWidget->setHorizontalHeaderLabels(headers);

    // 创建并设置自定义代理到第二列
    MultiLineItemDelegate *delegate = new MultiLineItemDelegate(this);
    tableWidget->setItemDelegateForColumn(1, delegate);

    // 填充表格数据
    for (int row = 0; row < 10; ++row) {
        for (int col = 0; col < 6; ++col) {
            QTableWidgetItem *item = new QTableWidgetItem; // 创建单元格项
            if (col == 1) {
                item->setText("语文\n正在撤销"); // 第二列显示多行内容
            } else {
                item->setText(QString("Row %1 Col %2").arg(row).arg(col)); // 其他列显示测试内容
            }
            tableWidget->setItem(row, col, item); // 将单元格项添加到表格中
        }
    }

    // 设置默认行高,根据字体高度调整
    QFontMetrics fm(font()); // 获取默认字体指标
    int rowHeight = fm.height() * 2; // 每行设置为两倍字体高度
    for (int i = 0; i < tableWidget->rowCount(); ++i) {
        tableWidget->setRowHeight(i, 150); // 设置行高
    }

    setCentralWidget(tableWidget); // 将表格控件设置为主窗口的中心部件
}

MainWindow::~MainWindow()
{
    // 析构函数,释放资源
}

multilineitemdelegate.h

#ifndef MULTILINEITEMDELEGATE_H
#define MULTILINEITEMDELEGATE_H

#include <QStyledItemDelegate>
#include <QPainter>

// 自定义代理类,用于实现多行文本的绘制
class MultiLineItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit MultiLineItemDelegate(QObject *parent = nullptr);

    // 重写 paint 方法,用于自定义绘制单元格内容
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

    // 重写 sizeHint 方法,用于计算单元格的尺寸
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};

#endif // MULTILINEITEMDELEGATE_H

multilineitemdelegate.cpp

#include "multilineitemdelegate.h"

MultiLineItemDelegate::MultiLineItemDelegate(QObject *parent)
    : QStyledItemDelegate(parent)
{
}

void MultiLineItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    painter->save(); // 保存画笔状态

    // 获取单元格的多行文本
    QString text = index.data(Qt::DisplayRole).toString(); // 获取数据内容
    QStringList lines = text.split('\n'); // 使用换行符分割为多行

    // 绘制单元格背景
    if (option.state & QStyle::State_Selected) {
        painter->fillRect(option.rect, option.palette.highlight()); // 选中时绘制高亮背景
    } else {
        painter->fillRect(option.rect, option.palette.base()); // 未选中时绘制默认背景
    }

    // 设置字体高度
    QFontMetrics fm(option.font); // 获取字体指标
    int lineHeight = fm.height(); // 每行文本的高度
    // 计算文本绘制起始点,保证文本在垂直方向居中
    int y = option.rect.top() + (option.rect.height() - lineHeight * lines.size()) / 2;

    // 循环绘制每一行文本
    for (int i = 0; i < lines.size(); ++i) {
        // 设置每行文本的颜色
        if (i == 0) {
            painter->setPen(option.palette.color(QPalette::Text)); // 第一行使用默认颜色
        } else if (i == 1) {
            painter->setPen(Qt::red); // 第二行使用红色字体
        }

        // 绘制文本
        painter->drawText(option.rect.left() + 5, y + (i + 1) * lineHeight, lines[i]);
    }

    painter->restore(); // 恢复画笔状态
}

QSize MultiLineItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    // 获取多行文本内容
    QString text = index.data(Qt::DisplayRole).toString();
    QStringList lines = text.split('\n'); // 分割为多行

    // 根据行数计算单元格高度
    QFontMetrics fm(option.font); // 获取字体指标
    return QSize(option.rect.width(), fm.height() * lines.size());
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python学习35天

# 定义父类 class Computer: CPUNone MemoryNone diskNone def __init__(self,CPU,Memory,disk): self.disk disk self.Memory Memory self.CPU CPU def get_details(self): return f"CPU:{self.CPU}\tdisk:{self.disk}\t…

企业OA管理系统:Spring Boot技术深度解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Android 图形系统之一:概览

Android 图形系统是一套完整的架构&#xff0c;用于管理从应用绘制到显示屏幕的整个流程。它涉及多个层次和组件&#xff0c;从应用程序到硬件&#xff0c;确保每一帧都能准确、高效地呈现到用户的设备屏幕上。 1. Android 图形系统的架构 Android 图形系统的架构可以分为以下…

深度理解进程的概念(Linux)

目录 一、冯诺依曼体系 二、操作系统(OS) 设计操作系统的目的 核心功能 系统调用 三、进程的概念与基本操作 简介 查看进程 通过系统调用获取进程标识符 通过系统调用创建进程——fork() 四、进程的状态 操作系统中的运行、阻塞和挂起 理解linux内核链表 Linux的进…

系统思考—共同看见

在一家零售企业的项目中&#xff0c;团队频繁讨论客户流失的严重性&#xff0c;但每次讨论的结果都无法明确找出问题的根源。大家都知道客户流失了&#xff0c;但究竟是什么原因导致的&#xff0c;始终没有一致的答案。市场部认为是客户体验差&#xff0c;客服部门觉得是响应慢…

从0开始学PHP面向对象内容之常用设计模式(组合,外观,代理)

二、结构型设计模式 4、组合模式&#xff08;Composite&#xff09; 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它将对象组合成树形结构以表示”部分–整体“的层次结构。通过组合模式&#xff0c;客户端可以以一致的方式处理单个对…

Linux 线程互斥

目录 0.前言 1.相关概念 2.互斥量&#xff08;mutex&#xff09; 2.1 代码引入 2.2为什么需要互斥量 2.3互斥量的接口 2.3.1 初始化互斥量 2.3.2 销毁互斥量 2.3.3 互斥量加锁和解锁 2.4改写代码 3.互斥量的封装 4.小结 &#xff08;图像由AI生成&#xff09; 0.前言 在多线…

前端实用知识-用express搭建本地服务器

目录 一、为什么会有这篇文章&#xff1f; 二、使用前的准备-如环境、工具 三、如何使用&#xff1f;-express常用知识点 四、代码演示-配合截图&#xff0c;简单易懂 一、为什么会有这篇文章&#xff1f; 在日常前端开发中&#xff0c;我们离不开数据&#xff0c;可能是用…

用nextjs开发时遇到的问题

这几天已经基本把node后端的接口全部写完了&#xff0c;在前端开发时考虑时博客视频类型&#xff0c;考虑了ssr&#xff0c;于是选用了nextJs&#xff0c;用的是nextUi,tailwincss,目前碰到两个比较难受的事情。 1.nextUI个别组件无法在服务器段渲染 目前简单的解决方法&…

【数据结构】二叉树(2)

目录 1. 二叉树的遍历 前序遍历 中序遍历 后序遍历 2. 计算二叉树中的节点个数 3. 计算二叉树中叶子节点个数 4. 计算二叉树的深度 5. 计算二叉树第k层节点个数 6. 二叉树基础练习 7. 二叉树的创建 8. 二叉树的销毁 9. 层序遍历 10. 判断二叉树是否为完全二叉树 1…

比特币与区块链原理解析:矿机挖矿与去中心化的未来

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

StarRocks-join优化

1、背景 有两个大表&#xff0c;都是6kw级别上下的&#xff0c;通过SR然后包装了一个接口对外提供查询&#xff0c;当前的问题是&#xff0c;这样大的join查询会导致BE直接宕机。并且这个sql很有代表性&#xff0c;我截图如下&#xff1a; 这个表是个单分区&#xff0c;所以直接…

Qt中2D绘制系统

目录 一、Qt绘制系统 1.1Qt绘制基本概念 1.2 绘制代码举例 1.3画家 1.3.1 QPainter的工作原理&#xff1a; 1.3.2 自定义绘制饼状图&#xff1a; 1.4画笔和画刷 1.4.1画笔 1.4.2 画刷填充样式 1.5 反走样和渐变 1.6绘制设备 1.7坐标变换 1.8QPainterPath 1.9绘制文…

基于.NET调用WebService服务

基于.NET调用WebService服务 上一篇文章用java的Spring Boot框架搭建了一个WebService服务端&#xff0c;这篇文章通过.NET进行调用&#xff0c;下文基于Visual Studio 2022 引入WebService服务 项目右键 -> 添加 -> 服务引用 选择WCF Web Service&#xff0c;点击下一…

IIC 随机写+多次写 可以控制写几次

verilog module icc_tx#(parameter SIZE 2 , //用来控制写多少次 比如地址是0000 一个地址只能存放8bit数据 超出指针就会到下一个地址0001parameter CLK_DIV 50_000_000 ,parameter SPEED 100_000 ,parameter LED 50 )( input wire c…

微信小程序+Vant-自定义选择器组件(多选

实现效果 无筛选&#xff0c;如有需要可参照单选组件中的方法.json文件配置"component": true,columns需要处理成含dictLabel和dictValue字段&#xff0c;我是这样处理的&#xff1a; let list arr.map(r > {return {...r,dictValue: r.xxxId,dictLabel: r.xxx…

基于边缘智能网关的机房安全监测应用

随着我国工业互联网的扎实推进&#xff0c;越来越多地区积极建设信息基础设施&#xff0c;以充沛算力支撑产业物联网的可持续发展&#xff0c;数据机房就是其中的典型代表。而且随着机房规模的扩大&#xff0c;对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…

HarmonyOS 应用跨团队 Debug 协作

文章目录 前言案例背景与问题分析问题背景问题分析工具 方法与代码实现前端模块的优化&#xff1a;日志记录与网络监听日志记录代码示例代码解析实现逻辑实际应用场景 网络状态监听代码示例代码解析实现逻辑实际应用场景 后端模块的优化&#xff1a;接口性能与容错机制接口性能…

《UnityShader 入门精要》更复杂的光照

代码&示例图见&#xff1a;zaizai77/Shader-Learn: 实现一些书里讲到的shader 到了这里就开启了书里的中级篇&#xff0c;之后会讲解 Unity 中的渲染路径&#xff0c;如何计算光照衰减和阴影&#xff0c;如何使用高级纹理和动画等一系列进阶内容 Unity 中的渲染路径 在U…

Ubuntu20.04安装kalibr

文章目录 环境配置安装wxPython下载编译测试报错1问题描述问题分析问题解决 参考 环境配置 Ubuntu20.04&#xff0c;python3.8.10&#xff0c;boost自带的1.71 sudo apt update sudo apt-get install python3-setuptools python3-rosinstall ipython3 libeigen3-dev libboost…