C++ QT, 改进这个类FrozenColumnHeader。当内容太长时,显示不全,需要鼠标悬浮显示。

头文件 frozencolumnheader.h

cpp

#ifndef FROZENCOLUMNHEADER_H
#define FROZENCOLUMNHEADER_H#include <QHeaderView>
#include <QTableView>
#include <QPainter>
#include <QMouseEvent>
#include <QStyleOptionHeader>
#include <QItemSelectionModel>
#include <QEvent>
#include <QToolTip>class FrozenColumnHeader : public QHeaderView
{Q_OBJECTpublic:explicit FrozenColumnHeader(QTableView* tableView);~FrozenColumnHeader() override = default;// 新增方法:设置字体void setHeaderFont(const QFont& font);void setHeaderFontSize(int pointSize);void setHeaderFontBold(bool bold);void setHeaderTextColor(const QColor& color);// 新增方法:设置工具提示相关属性void setToolTipEnabled(bool enabled);bool isToolTipEnabled() const;void setToolTipDuration(int milliseconds);int toolTipDuration() const;signals:void sectionClicked(int logicalIndex);protected:void paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const override;void mousePressEvent(QMouseEvent* event) override;void mouseMoveEvent(QMouseEvent* event) override;void leaveEvent(QEvent* event) override;QSize sizeHint() const override;bool event(QEvent* event) override;private slots:void onSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);private:QString getElidedText(const QString& text, const QFont& font, int width) const;bool needToolTip(const QString& text, const QFont& font, int width) const;private:QTableView* m_tableView;int m_hoveredSection = -1;QFont m_headerFont;          // 新增:字体设置QColor m_headerTextColor;    // 新增:文字颜色bool m_toolTipEnabled = true; // 新增:是否启用工具提示int m_toolTipDuration = 3000; // 新增:工具提示显示时间(毫秒)QString m_lastToolTipText;   // 新增:上次显示的工具提示文本
};#endif // FROZENCOLUMNHEADER_H

实现文件 frozencolumnheader.cpp

cpp

#include "frozencolumnheader.h"
#include <QDebug>
#include <QFontMetrics>FrozenColumnHeader::FrozenColumnHeader(QTableView* tableView): QHeaderView(Qt::Vertical, tableView), m_tableView(tableView)
{// 初始化默认字体设置m_headerFont = QFont("Microsoft YaHei"); // 默认字体和大小m_headerFont.setPixelSize(12);m_headerTextColor = Qt::black;               // 默认文字颜色setSectionsClickable(true);setHighlightSections(true);//setDefaultSectionSize(35);setMinimumWidth(200);setAttribute(Qt::WA_Hover, true);// 连接选择变化信号if (tableView && tableView->selectionModel()) {connect(tableView->selectionModel(), &QItemSelectionModel::selectionChanged,this, &FrozenColumnHeader::onSelectionChanged);}
}// 设置字体
void FrozenColumnHeader::setHeaderFont(const QFont& font)
{m_headerFont = font;update(); // 重绘
}// 设置字体大小
void FrozenColumnHeader::setHeaderFontSize(int pointSize)
{m_headerFont.setPointSize(pointSize);update(); // 重绘
}// 设置字体加粗
void FrozenColumnHeader::setHeaderFontBold(bool bold)
{m_headerFont.setBold(bold);update(); // 重绘
}// 设置文字颜色
void FrozenColumnHeader::setHeaderTextColor(const QColor& color)
{m_headerTextColor = color;update(); // 重绘
}// 设置是否启用工具提示
void FrozenColumnHeader::setToolTipEnabled(bool enabled)
{m_toolTipEnabled = enabled;
}// 获取工具提示启用状态
bool FrozenColumnHeader::isToolTipEnabled() const
{return m_toolTipEnabled;
}// 设置工具提示显示时间
void FrozenColumnHeader::setToolTipDuration(int milliseconds)
{m_toolTipDuration = milliseconds;
}// 获取工具提示显示时间
int FrozenColumnHeader::toolTipDuration() const
{return m_toolTipDuration;
}// 获取省略文本
QString FrozenColumnHeader::getElidedText(const QString& text, const QFont& font, int width) const
{QFontMetrics metrics(font);return metrics.elidedText(text, Qt::ElideRight, width - 10); // 留出10像素的边距
}// 检查是否需要显示工具提示
bool FrozenColumnHeader::needToolTip(const QString& text, const QFont& font, int width) const
{if (text.isEmpty()) {return false;}QFontMetrics metrics(font);return metrics.horizontalAdvance(text) > (width - 10); // 留出10像素的边距
}void FrozenColumnHeader::paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const
{if (!m_tableView || !m_tableView->model())return;if (!painter || logicalIndex < 0 || logicalIndex >= count()) {return;}// 使用静态变量缓存颜色static const QColor selectedBgColor("#0078d7");static const QColor selectedBorderColor("#005a9e");static const QColor normalBgColor("#f8f8f8");static const QColor normalBorderColor("#d0d0d0");static const QColor hoverBgColor("#e3f2fd");static const QColor textColorWhite(Qt::white);static const QColor textColorBlack(Qt::black);// 关键修复:正确检查选择状态bool isSelected = false;if (m_tableView->selectionModel()) {// 检查该行是否有任何选中的单元格QModelIndex index = m_tableView->model()->index(logicalIndex, 0);isSelected = m_tableView->selectionModel()->isSelected(index);}const bool isHovered = (logicalIndex == m_hoveredSection);// 获取数据const QString data = m_tableView->model()->data(m_tableView->model()->index(logicalIndex, 0)).toString();painter->save();// 确定背景和文字颜色QColor backgroundColor;QColor textColor;QColor borderColor;if (isSelected) {backgroundColor = selectedBgColor;textColor = textColorWhite;borderColor = selectedBorderColor;}else if (isHovered) {backgroundColor = hoverBgColor;textColor = textColorBlack;borderColor = normalBorderColor;}else {backgroundColor = normalBgColor;textColor = textColorBlack;borderColor = normalBorderColor;}// 绘制背景painter->fillRect(rect, backgroundColor);// 绘制边框painter->setPen(palette().mid().color());painter->drawRect(rect);// 设置字体和文字颜色painter->setFont(m_headerFont);painter->setPen(m_headerTextColor);// 绘制文本painter->setPen(textColor);QFont font = painter->font();if (isSelected) {font.setBold(true);}painter->setFont(font);// 如果文本太长,显示省略号QString displayText = getElidedText(data, font, rect.width());painter->drawText(rect, Qt::AlignCenter, displayText);// 绘制边框painter->setPen(borderColor);painter->drawRect(rect.adjusted(0, 0, -1, -1));painter->restore();
}bool FrozenColumnHeader::event(QEvent* event)
{if (m_toolTipEnabled && event->type() == QEvent::ToolTip) {QHelpEvent* helpEvent = static_cast<QHelpEvent*>(event);int logicalIndex = logicalIndexAt(helpEvent->pos());if (logicalIndex >= 0 && logicalIndex < count()) {// 获取数据QString data = m_tableView->model()->data(m_tableView->model()->index(logicalIndex, 0)).toString();// 获取该section的矩形区域QRect sectionRect(sectionViewportPosition(logicalIndex), 0, sectionSize(logicalIndex), height());// 检查是否需要显示工具提示if (needToolTip(data, m_headerFont, sectionRect.width())) {QToolTip::showText(helpEvent->globalPos(), data, this, sectionRect, m_toolTipDuration);m_lastToolTipText = data;return true;}}QToolTip::hideText();event->ignore();return true;}return QHeaderView::event(event);
}void FrozenColumnHeader::mousePressEvent(QMouseEvent* event)
{if (!m_tableView || !m_tableView->selectionModel()) {QHeaderView::mousePressEvent(event);return;}const int logicalIndex = logicalIndexAt(event->pos());if (logicalIndex >= 0) {// 清除所有现有选择m_tableView->selectionModel()->clearSelection();// 选择整行(包括隐藏的第一列)for (int col = 0; col < m_tableView->model()->columnCount(); ++col) {QModelIndex index = m_tableView->model()->index(logicalIndex, col);m_tableView->selectionModel()->select(index, QItemSelectionModel::Select);}emit sectionClicked(logicalIndex);}else {// 点击表头空白处时清除所有选择m_tableView->selectionModel()->clearSelection();}update();QHeaderView::mousePressEvent(event);
}void FrozenColumnHeader::mouseMoveEvent(QMouseEvent* event)
{QHeaderView::mouseMoveEvent(event);const int newHoveredSection = logicalIndexAt(event->pos());if (newHoveredSection != m_hoveredSection) {m_hoveredSection = newHoveredSection;update();}
}void FrozenColumnHeader::leaveEvent(QEvent* event)
{QHeaderView::leaveEvent(event);m_hoveredSection = -1;update();
}QSize FrozenColumnHeader::sizeHint() const
{return QSize(200, QHeaderView::sizeHint().height());
}void FrozenColumnHeader::onSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected)
{Q_UNUSED(selected);Q_UNUSED(deselected);// 强制立即更新整个表头update();// 确保视图也更新if (viewport()) {viewport()->update();}
}

主要改进内容:

  1. 添加工具提示功能

    • 重写 event() 方法处理 QEvent::ToolTip 事件

    • 添加 setToolTipEnabled()isToolTipEnabled() 等方法控制工具提示行为

    • 添加 setToolTipDuration()toolTipDuration() 方法设置工具提示显示时间

  2. 文本省略处理

    • 添加 getElidedText() 方法处理文本过长时的省略显示

    • 添加 needToolTip() 方法判断是否需要显示工具提示

    • 在 paintSection() 中使用省略文本绘制

  3. 智能工具提示显示

    • 只在文本确实过长时才显示工具提示

    • 工具提示显示完整内容

    • 工具提示位置与对应的表头section对齐

  4. 性能优化

    • 只在需要时显示工具提示,避免不必要的提示

    • 使用字体度量准确计算文本宽度

使用方法:

cpp

FrozenColumnHeader* header = new FrozenColumnHeader(tableView);
header->setToolTipEnabled(true); // 启用工具提示(默认已启用)
header->setToolTipDuration(5000); // 设置工具提示显示5秒

这样改进后,当表头内容太长显示不全时,鼠标悬停会显示完整的文本内容,提升了用户体验。

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

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

相关文章

SQL-约束

在 SQL 中&#xff0c;约束&#xff08;Constraint&#xff09;是用于限制表中数据的规则&#xff0c;目的是保证数据的完整性、一致性和有效性。常见的约束类型包括&#xff1a;主键约束、外键约束、非空约束、唯一约束、检查约束、默认值约束等。下面结合你提供的代码&#x…

kafka如何保证消息不被重复消费

首先kafka事务没办法做到这一点&#xff0c;事务只能保证以下几点&#xff1a;producer发送多条消息&#xff0c;要么同时成功&#xff0c;要么同时失败&#xff1b;在没有提交事务之前&#xff0c;消息对消费者不可见&#xff0c;事务失败需要程序员自己调用kafka的 abort 回滚…

[性能分析与优化]伪共享问题(perf + cpp)

伪共享问题的主要来源有两件事每次cache读入一个数据时实际上读入整个数据行多个线程可能会读入相同的数据行由于cache写回内存时也是按照数据行进行写入的&#xff0c;导致了写回内存时并不能做到真正的共享&#xff0c;而是需要等待。解决方案有两种将需要并行计算的数据使用…

【Uni-App+SSM 宠物项目实战】Day14:商家服务列表

一、前言 欢迎回到mypet项目实战!📋 今天我们实现商家服务管理核心功能——商家服务列表展示与上拉加载更多。商家成功注册并通过审核后,可发布宠物服务项目(如洗澡、美容、医疗等),用户通过服务列表浏览并预约。 本次实现的核心是**“分页加载”**技术:后端使用MyBa…

DNS服务管理

一、概述 概念 Domain Name Service&#xff0c;一套分布式的域名服务系统&#xff0c;即有多个DNS服务器遍布于世界。每个DNS服务器上存放着大量的机器域名和IP地址的映射&#xff0c;并且是动态更新。众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。 …

自定义类型:结构体、联合与枚举(2)

目录 前言 一、 联合体类型的声明 介绍&#xff1a; 注意&#xff1a; 二、 联合体的特点 介绍&#xff1a; 代码举例&#xff1a; 三、联合体⼤⼩的计算 介绍&#xff1a; 联合体大小的计算规则 1. 基础规则 1. 确定最大成员大小 2. 计算对齐模数的最小公倍数 3…

Oceanbase下使用TPC-H模式生成数据

1.下载tpc-h http://www.tpc.org/ 点击下载始终弹出这个画面&#xff0c;尝试了多种方法无效&#xff0c;最后选择科学上网工具&#xff0c;才正常下载。 通过网盘分享的文件&#xff1a;TPC-H-Toolv3.zip 链接: https://pan.baidu.com/s/14CXrp7v_7XkPtXfFLkziBQ?pwdqf5t 提…

LeetCode 面试经典 150_哈希表_单词规律(41_290_C++_简单)

LeetCode 面试经典 150_哈希表_单词规律&#xff08;41_290_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;哈希表&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;哈希表&a…

librespeed c++ 上传下载带宽测试 排坑全流程

在搭建 LibreSpeed 测速服务并实现基于 curl/API 的上传下载测试时&#xff0c;遇到 Nginx 配置冲突、PHP 权限异常等问题。本文将梳理从环境搭建到功能验证的全流程&#xff0c;针对 “curl 上传报 404/405”“PHP-FPM 权限拒绝”等典型问题&#xff0c;提供可复现的解决方案。…

重读生成概率模型1----基础概念

1 KL 散度 KL 散度的作为是描述两个分布的差异的&#xff0c;首先是度量一个分布&#xff0c;用熵来度量。 1.1 熵 在介绍熵之间&#xff0c;首先要度量单个事件的信息量 I(x)−logP(x)I(x)-logP(x)I(x)−logP(x) 整体的信息量 H(P)Ex P[−logP(x)]−∑P(x)logP(x) \begin{alig…

排查解决磁盘占用高问题(容器挂载的磁盘)

最近遇到磁盘占用高的告警&#xff0c;记录一下解决的思路。 首先是系统触发告警&#xff0c;通知我们某台机器磁盘占用高。&#xff08;或其他途径得知&#xff09; 通过XShell登录该机器。 执行df-h命令查看挂载占用情况找到真正占用高的挂载点挂载点/home目录占用高&#xf…

流体(1)

流体 Minecraft 中的流体(Fluid),也常被称为液体(Liquid),是一类能够自由流动、形成河流、瀑布或湖泊的特殊方块。它们的行为基于简化的流体力学,是游戏世界中动态环境的重要组成部分。 💧 流体是什么? 在 Minecraft 中,流体核心特点包括: 源方块与流动:每个流…

机器学习-卷积神经网络(CNN)

全连接层->卷积层 用有一个隐藏层的MLP训练ImageNet数据集&#xff08;300*300的图像&#xff0c;有1000个类别&#xff09;&#xff0c;要有10000个输出 会有10亿个可学习的参数&#xff0c;量太大 全连接&#xff1a;一个输出是根据所有输入加权得到在图片中识别物体&…

Ubuntu 磁盘扩容与扩容失败问题解决( df -h 与 GParted 显示空间不一致的问题 -LVM)

在管理 Linux 磁盘时&#xff0c;你是否遇到过这样的困惑&#xff1a;正常扩容之后&#xff0c;发现GParted 显示某个分区还有几十 GiB 可用&#xff0c;但 df -h 却提示该分区已接近满额&#xff1f;这种 “空间幻觉” 背后是系统存储管理的分层设计&#xff0c;本文将从原理到…

PyQt5中QLineEdit控件数值显示与小数位数控制

在PyQt5应用程序开发中&#xff0c;QLineEdit控件常用于显示和编辑文本内容。当需要用它来显示数值并控制小数位数时&#xff0c;开发者需要掌握一些特定的技巧。本文将深入探讨几种实现方法&#xff0c;每种方法都附带完整独立的代码示例。 数值格式化基础 在Python中&#xf…

LangChain使用方法以OpenAI 的聊天模型GPT-4o为例

以使用 OpenAI 的聊天模型&#xff08;如 GPT-4&#xff09;为例&#xff0c;从设置环境、初始化模型、调用模型到处理响应的各个方面进行介绍&#xff1a; 1. 环境设置 安装 langchain-openai 包。设置环境变量 OPENAI_API_KEY&#xff0c;用于认证&#xff08;以linux为例&am…

Oracle为数据大表创建索引方案

在日常业务中&#xff0c;避免不了为数据量大表补充创建索引的情况&#xff0c;如果快速、有效地创建索引成了一个至关重要的问题&#xff08;注意&#xff1a;虽然提供有ONLINE在线执行的方式&#xff0c;理想状态下不会阻塞DML操作&#xff0c;但ONLINE在开始、结束的两个时刻…

网站服务相关问题

目录 HTTP常见的状态码 http和https的区别以及使用的端口号 http处理请求的过程 https认证过程 正向代理和反向代理的区别 HTTP常见的状态码 HTTP&#xff08;超文本传输协议&#xff09;定义了一系列的状态码&#xff0c;用于表示客户端请求的处理结果。以下是一些常见的…

Go并发编程实战:深入理解Goroutine与Channel

Go并发编程实战&#xff1a;深入理解Goroutine与ChannelGo并发编程实战&#xff1a;深入理解Goroutine与Channel概述1. 为什么是Go的并发&#xff1f;从“线程”与“协程”说起2. Goroutine&#xff1a;如何使用&#xff1f;3. Channel&#xff1a;Goroutine间的安全通信创建与…

2025服贸会“海淀之夜”,点亮“科技”与“服务”底色

2025年9月12日傍晚&#xff0c;北京颐和园&#xff0c;十七孔桥旁&#xff0c;2025年中国国际服务贸易交易会“海淀之夜”如约而至。在“海淀之夜”&#xff0c;科技机构、金融机构、咨询服务机构、出海服务企业以及跨国企业和国际友人等&#xff0c;将目光聚焦于此。被第三方机…