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
英文地址,請注明出處:http://en.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;將目光聚焦于此。被第三方機…