Qt / PySide / PyQt - 自定义工具提示对鼠标事件不透明

时间:2014-04-18 15:29:32

标签: qt pyqt pyside

QToolTip.showText / hideText以及QWidget.setToolTip()存在一些限制,这使我的需求变得不方便。所以我想实现我自己的类,它的行为类似于工具提示。我正在使用QLabel,设置windws标志和属性,一切正常,但它对鼠标事件不透明。

在创建应具有此自定义工具提示的窗口小部件时,我使用以下代码段:

toolTipWidget = QtGui.QLabel()
toolTipWidget.setFrameShape(QtGui.QFrame.StyledPanel)
toolTipWidget.setWindowFlags(QtCore.Qt.ToolTip)
toolTipWidget.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
toolTipWidget.hide()
self.toolTipWidget = toolTipWidget

在小部件的mouseMoveEvent中,我有以下内容:

def mouseMoveEvent(self, event):
    text = self.getDescription(event.pos())  # some method which returns a string
    if text:
        self.toolTipWidget.setText(text)
        self.toolTipWidget.move(event.globalPos() + QtCore.QPoint(5, 5))
        self.toolTipWidget.adjustSize()
        self.toolTipWidget.show()
    else:
        self.toolTipWidget.hide()

正如您在代码中看到的那样,工具提示随鼠标移动。但有时可能会发生鼠标光标移动到足以进入工具提示区域然后工具提示接管鼠标事件,这意味着主窗口小部件的mouseMoveEvent未被调用且工具提示停止移动并获得卡住。这很奇怪,因为我设置了属性WA_TransparentForMouseEvents。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我仍然没有找到为什么在我的自定义工具提示中忽略了WA_TransparentForMouseEvents。但我找到了解决我问题的解决方法。我为主窗口小部件安装了事件过滤器,它通过我的自定义工具提示处理鼠标移动事件,并调用与主窗口小部件的mouseMoveEvent处理程序相同的代码 - 即将工具提示窗口小部件从鼠标光标移开。