首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在pyqt5中实现Qtooltip转角

如何在pyqt5中实现Qtooltip转角
EN

Stack Overflow用户
提问于 2022-04-12 16:49:57
回答 1查看 136关注 0票数 -1

如何在pyqt5中使工具提示转角。尝试了许多样式表,但是它不起作用。Qtooltip上的框架保持不变。

EN

回答 1

Stack Overflow用户

发布于 2022-04-13 15:35:28

Qt样式表无法设置小部件的掩码,这是将顶级小部件的形状更改为与标准矩形不同的形状所必需的。

虽然问题有部分答案,但它很老,没有解释如何正确使用样式提示并实现样式。

该解决方案基于一个QProxyStyle,它通过根据内容创建适当的掩码来更新returnData of styleHint()

这里最大的问题是,绝对存在不可能知道小部件使用的QSS属性(而且访问小部件的styleSheet()是没有意义的,因为样式表可以继承):我们永远无法知道一个小部件是否有边框,以及该边框的可能半径。

但是有一种方法:我们可以在本地呈现QImage上的工具提示,并使用createHeuristicMask()根据内容获得可能的掩码,应该使用应用程序样式表来设置这些掩码。

如果由于某种原因,掩码仍然是小部件的完整矩形,那么无论如何我们都可以“猜”出一个标准的圆形掩码。

注意,returnData of styleHint()是一个QStyleHintReturn,而我们需要一个QStyleHintReturnMask,因为我们必须能够编写它的region;为了实现这一点,我们使用sip模块的cast()函数(通常与PyQt一起安装)。

下面使用工具提示样式表的默认调色板颜色,但重要的方面是边框必须与背景略有不同(否则上面的掩码创建将无法工作)。

代码语言:javascript
复制
from PyQt5 import QtCore, QtGui, QtWidgets
import sip

class ProxyStyle(QtWidgets.QProxyStyle):
    def styleHint(self, hint, opt=None, widget=None, returnData=None):
        if hint == self.SH_ToolTip_Mask and widget:
            if super().styleHint(hint, opt, widget, returnData):
                # the style already creates a mask
                return True
            returnData = sip.cast(returnData, QtWidgets.QStyleHintReturnMask)
            src = QtGui.QImage(widget.size(), QtGui.QImage.Format_ARGB32)
            src.fill(QtCore.Qt.transparent)
            widget.render(src)

            mask = QtGui.QRegion(QtGui.QBitmap.fromImage(
                src.createHeuristicMask()))
            if mask == QtGui.QRegion(opt.rect.adjusted(1, 1, -1, -1)):
                # if the stylesheet doesn't set a border radius, create one
                x, y, w, h = opt.rect.getRect()
                mask = QtGui.QRegion(x + 4, y, w - 8, h)
                mask += QtGui.QRegion(x, y + 4, w, h - 8)
                mask += QtGui.QRegion(x + 2, y + 1, w - 4, h - 2)
                mask += QtGui.QRegion(x + 1, y + 2, w - 2, h - 4)

            returnData.region = mask
            return 1
        return super().styleHint(hint, opt, widget, returnData)


app = QtWidgets.QApplication([])
app.setStyle(ProxyStyle())
palette = app.palette()
app.setStyleSheet('''
    QToolTip {{
        color: {fgd};
        background: {bgd};
        border: 1px solid {border};
        border-radius: 4px;
    }}
'''.format(
    fgd=palette.color(palette.ToolTipText).name(), 
    bgd=palette.color(palette.ToolTipBase).name(), 
    border=palette.color(palette.ToolTipBase).darker(110).name()
))
test = QtWidgets.QPushButton('Hover me', toolTip='Tool tip')
test.show()
app.exec()

但是,请注意,这并不是最优的,因为它涉及每次显示/调整工具提示时呈现:如果您的程序显示了许多工具提示或非常频繁地更新它们,那么性能可能会变得很差。另一种方法是完全跳过启发式掩码创建,只需根据内容设置一个预定义的默认掩码,如上面styleHint()覆盖的末尾所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71846446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档