news 2026/4/25 7:37:47

QToolTip+QSS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QToolTip+QSS

QToolTip本质上只是一个调用者,被调用的其实是一个被设置了Qt::ToolTip标志的QLabel,而且它比QLabel多了一个QSS属性:
opacity气泡整体的透明度

富文本显示

因为QLabel本身是支持富文本的,所以气泡也支持富文本也不足为奇。我们来看几个示例

啤酒是一个正常的文本:

啤酒

饮料显示了一个图片:

<html><head/><body> <p><img src=":/images/26.png"/></p> </body></html>

矿泉水显示了很大的字

<html><head/><body> <p><span style=" font-size:72pt; font-weight:600;">矿泉水</span></p> </body></html>

小推车售卖员显示比较长的一段字 \n可以用来手动换行

啤酒饮料矿泉水,花生瓜子八宝粥。来,腿收一下哈!\n啤酒饮料矿泉水,红茶绿茶八宝粥,前面的让一让哈!

简单样式

QToolTip { background-color: #ccc; color: #ffffff; border: 1px solid #555555; border-radius: 5px; padding: 5px 10px; font-size: 13px; opacity: 120; }

可以看到,虽然加了opacity属性,但是实际没啥效果呀~ (再次强调,本豆用的是Qt5.12.10版本,因为原来在其它的Qt版本上用了,是有效果的,不确定是不是版本问题),既然如此我们只好另辟蹊径了。

class ToolTipFilter : public QObject { Q_OBJECT protected: bool eventFilter(QObject* obj, QEvent* event) override { if (event->type() == QEvent::ToolTip) { QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); QWidget* w = qobject_cast<QWidget*>(obj); if(w && !w->toolTip().isEmpty()) { QToolTip::showText(helpEvent->globalPos(), w->toolTip()); for(auto widget : qApp->topLevelWidgets()) { if(widget->objectName() == "qtooltip_label") { widget->setWindowOpacity(0.2); break; } } } else { QToolTip::hideText(); event->ignore(); } return true; } else { return QObject::eventFilter(obj, event); } } }; //再在main函数中加上这段 int main(int argc, char *argv[]) { QApplication a(argc, argv); a.installEventFilter(new ToolTipFilter); //<---关键代码 ... }

拦截全局的气泡消息,找到ObjectName为qtooltip_label的顶级Widget,为什么是qtooltip_label呢?因为本豆芽又去翻了源码。


然后强行给它加上0.2的透明度setWindowOpacity(0.2),这时候再看看我们的气泡就能老老实实的透明了。

完全自定义气泡

简单实现一个没有背景的气泡:

class CustomToolTip : public QLabel { public: explicit CustomToolTip(QWidget* parent = nullptr) : QLabel(parent, Qt::ToolTip | Qt::FramelessWindowHint) { setAttribute(Qt::WA_TranslucentBackground); setStyleSheet("color:red;"); } static CustomToolTip* instance; static void showToolTip(const QString& text, const QPoint& pos, QWidget *p) { delete instance; instance = new CustomToolTip(p); instance->setText(text); instance->move(pos + QPoint(0, 5)); instance->show(); } static void hideToolTip() { instance->hide(); } };

修改刚才拦截的代码,收到气泡事件时让它弹出我们自定义的气泡

class ToolTipFilter : public QObject { Q_OBJECT protected: bool eventFilter(QObject* obj, QEvent* event) override { if (event->type() == QEvent::ToolTip) { QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); QWidget* w = qobject_cast<QWidget*>(obj); if(w && !w->toolTip().isEmpty()) { // QToolTip::showText(helpEvent->globalPos(), w->toolTip()); // for(auto widget : qApp->topLevelWidgets()) // { // if(widget->objectName() == "qtooltip_label") // { // widget->setWindowOpacity(0.2); // break; // } // } CustomToolTip::showToolTip(w->toolTip(), helpEvent->globalPos(), w); } else { // QToolTip::hideText(); CustomToolTip::hideToolTip(); event->ignore(); } return true; } else { return QObject::eventFilter(obj, event); } } };

效果是有了,但是我们的这个气泡比官方的气泡效率要低,只是出于演示目的所以没有做优化,有需要的小伙伴可以参考官方的代码自行实现下,或者直接用AI生成一个。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 13:28:39

​Android 基础入门教程​2.5.8 Notification(状态栏通知)详解

2.5.8 Notification(状态栏通知)详解 分类 Android 基础入门教程 本节引言&#xff1a; 本节带来的是Android中用于在状态栏显示通知信息的控件&#xff1a;Notification&#xff0c;相信大部分 学Android都对他都很熟悉&#xff0c;而网上很多关于Notification的使用教程都是…

作者头像 李华
网站建设 2026/4/25 11:16:26

百考通----学术圈降重的放心之选

不要让降重问题成为您学术道路上的绊脚石&#xff0c;选择百考通&#xff0c;让专业的人做专业的事&#xff01;https://www.baikaotongai.com在AI写作普及的今天&#xff0c;论文降重成为刚需。面对豆包和百考通两款工具&#xff0c;究竟该如何选择&#xff1f;本文将通过真实…

作者头像 李华
网站建设 2026/4/25 22:45:50

基于Python + Django企业人力资源管理系统(源码+数据库+文档)

企业人力资源管理 目录 基于PythonDjango企业人力资源管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango企业人力资源管理系统 一、前言 博主介绍…

作者头像 李华
网站建设 2026/4/23 5:13:44

Python bool 类型常用方法与实战指南:极简类型的高效用法

Python bool 类型常用方法与实战指南&#xff1a;极简类型的高效用法 在 Python 中&#xff0c;bool&#xff08;布尔类型&#xff09;是一种极简且核心的数据类型&#xff0c;仅包含两个值&#xff1a;True&#xff08;真&#xff09;和 False&#xff08;假&#xff09;。它是…

作者头像 李华