QT:QTableView,QCheckBox、QMenu富文本上标

2023-11-03 19:40

本文主要是介绍QT:QTableView,QCheckBox、QMenu富文本上标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

嗯,第一次,稍微有点紧张,写的不好希望大佬不要批评我,会伤心的
相信上标这个简单而不简单的问题一定难道了不少像我一样想用简单方式,尝试通过Word、WPS里面的字符进行实现的傻缺。
话不多说,我们进入正题。

QTableView和QTableWidget方法一样,所以我只讲QTableWidget

说道QTableWidget我们肯定需要一个QTableWidget来做这个东西先随便建一个QTableWidget

然后进入正题,对于QTableWidget\QTableView我们需要用到QItemDelegate代理来进行绘制,这样可以节省很多时间,但是由于QTableView和QTableWiget的表头是独立的QHeadView而且代理设置是不生效的可以查阅QT表中的说明可知As a result, calling a header's setItemDelegate() function will have no effect.因此我们QHeadView只能从他本身的绘制事件入手

然后贴上代码:

#ifndef TOPRICH_H
#define TOPRICH_H#include <QTableView>
#include <QHeaderView>
#include <QCheckBox>
#include <QItemDelegate>
#include <QTableWidgetItem>class RichEditDelegate: public QItemDelegate
{Q_OBJECT
public :RichEditDelegate(QObject*parent=nullptr):QItemDelegate(parent){}void paint(QPainter*painter, const QStyleOptionViewItem&option, const QModelIndex&index) const;
private :
};class HeaderView : public QHeaderView
{Q_OBJECT
public:HeaderView(Qt::Orientation orientation, QWidget *parent = Q_NULLPTR):QHeaderView(orientation, parent){}HeaderView(QHeaderView tb):QHeaderView(tb.orientation()){}void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;};
#endif // TOPRICH_H
#include "TopRich.h"
#include <QDebug>
#include <QTextDocument>
#include <QtWidgets/QApplication>
#include <QStylePainter>
#include <QAbstractTextDocumentLayout>
#include <QStyleOptionViewItem>
#include <QPainter>void RichEditDelegate::paint(QPainter*painter, const QStyleOptionViewItem&option, const QModelIndex&index) const
{QStyleOptionViewItem viewOption(option);if (option.state.testFlag(QStyle::State_HasFocus))viewOption.state = viewOption.state ^ QStyle::State_HasFocus;QStyle *pStyle = viewOption.widget? viewOption.widget->style() : QApplication::style();QString strHTML = QString("");strHTML = index.model()->data(index, Qt::DisplayRole).toString();QRect textRect = pStyle->subElementRect(QStyle::SE_ItemViewItemText, &viewOption);QFont fontDefault;int fwidth = QFontMetrics(fontDefault).width(strHTML);if(fwidth>textRect.width()){//此处是为了进行换行QString str;for(QString::iterator iter = strHTML.begin(); iter!=strHTML.end(); ++iter){str += *iter;fwidth = QFontMetrics(fontDefault).width(str);if(fwidth>textRect.width()-8){if(str.indexOf("\n") == -1){if((*iter) != '-' && *(++iter) != 's'){str += '\n';--iter;}else{str += *iter;str += '\n';}}for(++iter;iter!=strHTML.end();++iter)str += *iter;break;}}strHTML = str;}strHTML.replace("/s", "<sup>-s</sup>");strHTML.replace("\n","<br>");QTextDocument doc;doc.setHtml(strHTML);QAbstractTextDocumentLayout::PaintContext paintContext;if((option.state & QStyle::State_Selected) == QStyle::State_Selected){drawBackground(painter, viewOption, index);}painter->save();// 坐标变换,将左上角设置为原点painter->translate(textRect.topLeft());// 设置HTML绘制区域painter->setClipRect(textRect.translated(-textRect.topLeft()));doc.documentLayout()->draw(painter, paintContext);painter->restore();}
//----------------------------------------------------------------------------------------------------------------------------
void HeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{QAbstractItemModel * mo = model();QVariant hData = mo->headerData(logicalIndex, Qt::Horizontal);QString hDataStr = hData.toString();if(hDataStr.contains("<sup>") || hDataStr.contains("/s")){//设置显示文本为空,使用默认样式QStyleOptionHeader viewOption;initStyleOption(&viewOption);QStyle * pStyle = style();viewOption.rect = rect;viewOption.text = "";pStyle->drawControl(QStyle::CE_Header, &viewOption, painter);//需要显示的HTMLQString strHTML = QString(hDataStr);QRect textRect = pStyle->subElementRect(QStyle::SE_HeaderLabel, &viewOption);QPoint textPoint= textRect.topLeft();textPoint.setX(textPoint.x());strHTML.replace("/s","<sup>-s</sup>");strHTML.replace("\n","<br>");//qDebug() << "HeaderView::paintSection -- fwidth:" << strHTML;QTextDocument doc;doc.setHtml(strHTML);QAbstractTextDocumentLayout::PaintContext paintContext;painter->save();//坐标变换,将左上角设置为原点painter->translate(textPoint);//设置HTML绘制区域painter->setClipRect(textRect.translated(-textPoint));doc.documentLayout()->draw(painter, paintContext);painter->restore();}else{painter->save();QHeaderView::paintSection(painter, rect, logicalIndex);painter->restore();}updatesEnabled();
}

最后简单的调用设置

ui->tableWidget->setItemDelegateForRow(0,new RichEditDelegate);    
ui->tableWidget->setHorizontalHeader(new HeaderView(ui->tableWidget->horizontalHeader()->orientation()));

见证奇迹的时候到了

整个解决方法中核心的地方就在于QT支持两种文本一个是PlainText一个是RichText,而RichText可以支持Html格式字符,所以我们在重载的时候就需要按照Html的格式进行修改,另一个就是需要了解Qt控件的绘图机制,QStyle的原理。了解以上之后,QMenu设置上标的方法就很简单了。附上代码:

void TopStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
{if(element == QStyle::CE_MenuItem){if(const QStyleOptionMenuItem * btn = qstyleoption_cast<const QStyleOptionMenuItem *>(option)){QStyleOptionMenuItem suopt = *btn;QString strHTML = suopt.text;suopt.text = "";QProxyStyle::drawControl(element, &suopt, painter, widget);strHTML.replace("/s", "<sup>-s</sup>");QTextDocument doc;doc.setHtml(strHTML);QAbstractTextDocumentLayout::PaintContext paintContext;painter->save();//坐标转换QPoint textPoint = suopt.rect.topLeft();textPoint.setX(textPoint.x()+30);painter->translate(textPoint);painter->setClipRect(suopt.rect.translated(-textPoint));doc.documentLayout()->draw(painter, paintContext);painter->restore();}}elsereturn QProxyStyle::drawControl(element, option, painter, widget);
}

重载QProxyStyle然后设置QMenu的style就行了。
感谢浏览,写的不好,希望不要计较,共同进步!

这篇关于QT:QTableView,QCheckBox、QMenu富文本上标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/340447

相关文章

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep