PyQt自定义工具提示的实现过程是什么
Admin 2022-08-25 群英技术资讯 543 次浏览
Qt 自带的工具提示样式不太好看,就算加了样式表也时不时会失效,同时工具提示没有阴影,看起来就更难受了。所以本篇博客将会介绍自定义工具提示的方法,效果如下图所示:
工具提示其实就是一个带了标签的窗口,为了给工具提示加上阴影,只要给窗口设置 QGraphicsShadowEffect
即可。同时 QToolTip
弹出之后不会一直卡在界面上,一段时间后就会消失,所以我们应该给自定义的工具提示加上一个 QTimer
,时间溢出之后就隐藏工具提示。
# coding:utf-8 from PyQt5.QtCore import QFile, QPropertyAnimation, QTimer, Qt from PyQt5.QtGui import QColor from PyQt5.QtWidgets import (QApplication, QFrame, QGraphicsDropShadowEffect, QHBoxLayout, QLabel) class ToolTip(QFrame): def __init__(self, text='', parent=None): super().__init__(parent=parent) self.__text = text self.__duration = 1000 self.timer = QTimer(self) self.hBox = QHBoxLayout(self) self.label = QLabel(text, self) self.ani = QPropertyAnimation(self, b'windowOpacity', self) # set layout self.hBox.addWidget(self.label) self.hBox.setContentsMargins(10, 7, 10, 7) # add shadow self.shadowEffect = QGraphicsDropShadowEffect(self) self.shadowEffect.setBlurRadius(32) self.shadowEffect.setColor(QColor(0, 0, 0, 60)) self.shadowEffect.setOffset(0, 5) self.setGraphicsEffect(self.shadowEffect) self.timer.setSingleShot(True) self.timer.timeout.connect(self.hide) # set style self.setAttribute(Qt.WA_StyledBackground) self.setDarkTheme(False) self.__setQss() def text(self): return self.__text def setText(self, text: str): """ set text on tooltip """ self.__text = text self.label.setText(text) self.label.adjustSize() self.adjustSize() def duration(self): return self.__duration def setDuration(self, duration: int): """ set tooltip duration in milliseconds """ self.__duration = abs(duration) def __setQss(self): """ set style sheet """ f = QFile("resource/tooltip.qss") f.open(QFile.ReadOnly) self.setStyleSheet(str(f.readAll(), encoding='utf-8')) f.close() self.label.adjustSize() self.adjustSize() def setDarkTheme(self, dark=False): """ set dark theme """ dark = 'true' if dark else 'false' self.setProperty('dark', dark) self.label.setProperty('dark', dark) self.setStyle(QApplication.style()) def showEvent(self, e): self.timer.stop() self.timer.start(self.__duration) super().showEvent(e) def hideEvent(self, e): self.timer.stop() super().hideEvent(e)
工具提示继承自 QFrame
的原因是我们需要设置边框样式,样式表如下所示,支持亮暗两种主题:
ToolTip[dark="false"] { border: 1px solid rgba(0, 0, 0, 0.06); border-radius: 5px; background-color: rgb(243, 243, 243); } ToolTip[dark="true"] { border: 1px solid rgb(28, 28, 28); border-radius: 5px; background-color: rgb(43, 43, 43); } QLabel { background-color: transparent; font: 15px 'Segoe UI', 'Microsoft YaHei'; } QLabel[dark="false"] { color: black; } QLabel[dark="true"] { color: white; }
下述代码的运行效果就是动图中所示的样子,只要给想要设置工具提示的部件安装上事件过滤器,就能将 QToolTip
替换成自定义的工具提示:
# coding:utf-8 import sys from PyQt5.QtCore import QEvent, QPoint from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout from tool_tip import ToolTip class Demo(QWidget): def __init__(self): super().__init__() self.hBox = QHBoxLayout(self) self.button1 = QPushButton('キラキラ', self) self.button2 = QPushButton('食べた愛', self) self._toolTip = ToolTip(parent=self) # self._tooltip.setDarkTheme(True) self.button1.setToolTip('aiko - キラキラ ') self.button2.setToolTip('aiko - 食べた愛 ????') self.button1.setToolTipDuration(1000) self.button2.setToolTipDuration(5000) self.button1.installEventFilter(self) self.button2.installEventFilter(self) self.hBox.setContentsMargins(30, 30, 30, 30) self.hBox.setSpacing(20) self.hBox.addWidget(self.button1) self.hBox.addWidget(self.button2) self.resize(600, 300) self._toolTip.hide() with open('resource/demo.qss', encoding='utf-8') as f: self.setStyleSheet(f.read()) def eventFilter(self, obj, e: QEvent): if obj is self: return super().eventFilter(obj, e) tip = self._toolTip if e.type() == QEvent.Enter: tip.setText(obj.toolTip()) tip.setDuration(obj.toolTipDuration()) pos = obj.mapTo(self, QPoint(0, 0)) x = pos.x() + obj.width()//2 - tip.width()//2 y = pos.y() - 5 - tip.height() # adjust postion to prevent tooltips from appearing outside the window x = min(max(5, x), self.width() - tip.width() - 5) y = min(max(5, y), self.height() - tip.height() - 5) tip.move(x, y) tip.show() elif e.type() == QEvent.Leave: tip.hide() elif e.type() == QEvent.ToolTip: return True return super().eventFilter(obj, e) if __name__ == '__main__': app = QApplication(sys.argv) w = Demo() w.show() app.exec_()
用到的样式文件如下:
QWidget{ background-color: white; } QPushButton { background-color: rgb(204, 204, 204); padding: 10px 64px 10px 64px; font: 19px 'Microsoft YaHei'; border: transparent; border-radius: 4px; } QPushButton:pressed:hover { background-color: rgb(153, 153, 153); } QPushButton:hover { background-color: rgb(230, 230, 230); } QPushButton:disabled { background-color: rgb(204, 204, 204); color: rgb(122, 122, 122); }
自定义工具提示的方法已经介绍完了,更多好康的自定义小部件参见 GitHub 仓库 https://github.com/zhiyiYo/PyQt-Fluent-Widgets
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python可视化神器pyecharts绘制仪表盘,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
django是用Python开发的一个免费开源的web框架,能帮助我们快速搭建高性能的网站。这篇文章就给大家分享关于django的基础知识,主要介绍django上传文件的方式以及注意事项,下面我们一起来看看吧。
这篇文章主要介绍了Python返回真假值(True or False)小技巧,本文探讨的是最简洁的条件判断语句写法,本文给出了两种简洁写法,需要的朋友
所谓魔法函数(Magic Methods),是Python的⼀种⾼级语法,允许你在类中⾃定义函数(函数名格式⼀般为__xx__),并绑定到类的特殊⽅法中。⽐如在类A中⾃定义__str__()函数,则在调⽤str(A())时,会⾃动调⽤__str__()函数,并返回相应的结果
这篇文章主要介绍了python中读取txt文件时split()函数的妙用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008