【问题标题】:Why won't QToolTips appear on QActions within a QMenu为什么 QToolTips 不会出现在 QMenu 中的 QActions 上
【发布时间】:2014-02-12 10:25:23
【问题描述】:

我正在使用PySide 编写的 GUI 应用程序。我在QPushButton 上设置了QMenu,通过QMenu.addAction 添加了几个QActions。为了进一步向用户解释这些操作,我将QToolTipQAction.setToolTip 添加到这些操作中。

当我现在运行 GUI 时,我的 QToolTip 不会显示。下面发布的示例重现了相同的问题,有什么想法吗?

提前致谢

import sys
from PySide import QtGui

class Example(QtGui.QPushButton):

    def __init__(self, parent = None):
        super(Example, self).__init__(parent)

        self.setText('TestMenu')
        self.setToolTip('This is a Test Button')

        menu = QtGui.QMenu(self)
        action_1 = menu.addAction('Action1')
        action_1.setToolTip('This is action 1')
        action_2 = menu.addAction('Action2')
        action_2.setToolTip('This is action 2')
        action_3 = menu.addAction('Action3')
        action_3.setToolTip('This is action 3')
        action_4 = menu.addAction('Action4')
        action_4.setToolTip('This is action 4')

        self.setMenu(menu)
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()

    app.exec_()

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python pyside qmenu qaction


    【解决方案1】:

    在 Qt-5.1 或更高版本中,您可以简单地使用QMenu.setToolTipsVisible,菜单项将按预期显示它们的工具提示(参见QTBUG-13663):

        menu.setToolTipsVisible(True)
    

    但是,对于 Qt-4.* 和 Qt-5.0,情况有所不同。如果一个动作被添加到工具栏,它的工具提示显示出来;但如果将相同的操作添加到QMenu,则不会,并且没有内置 API 可以更改它。有几种方法可以解决这个问题。一种是改用status tips,它将在状态栏中显示菜单项信息。另一种是使用QMenu.hovered 信号和QToolTip.showText 自己实现菜单项工具提示功能:

            self.menu = QtGui.QMenu(self)
            ...
            self.menu.hovered.connect(self.handleMenuHovered)
    
        def handleMenuHovered(self, action):
            QtGui.QToolTip.showText(
                QtGui.QCursor.pos(), action.toolTip(),
                self.menu, self.menu.actionGeometry(action))
    

    【讨论】:

    • 谢谢,可能不是我要找的答案 ;) - 但它确实帮助我上路了!!我将在下面发布我的解决方案
    • 下一个答案(使用 QMenu 上的 setToolTipsVisible)实际上是 Qt 5.1+ 的正确答案。
    • @Wingware。最初的问题是关于 pyside,因此只有 qt4。但是,我现在更新了我的答案以涵盖 qt4 和 qt5。
    • setToolTipsVisible 在 Mac 上似乎没有帮助。也许 Mac 原生菜单不支持这个?
    【解决方案2】:

    实际上你不需要做任何变通来显示你的工具提示,从Qt 5.1开始,你可以使用QMenu的属性toolTipsVisible,默认设置为false

    请参阅related Qt suggestion

    【讨论】:

    • 这确实有效,应该是公认的解决方案,您必须确保为应用程序中的每个菜单和子菜单检查此属性,否则不会显示工具提示菜单
    【解决方案3】:

    在 ekhumoro 的帮助下,我找到了这个解决方案。这可能不是最漂亮的东西,下面的代码将菜单和工具提示定位得有些不协调,但在我的实际程序中它看起来很整洁。

    import sys
    from PySide import QtGui, QtCore
    
    class Example(QtGui.QPushButton):
    
        def __init__(self, parent = None):
            super(Example, self).__init__(parent)
    
            self.setText('TestMenu')
            self.setToolTip('This is a Test Button')
    
            menu = QtGui.QMenu(self)
            action_1 = menu.addAction('Action1')
            action_1.setToolTip('This is action 1')
            action_2 = menu.addAction('Action2')
            action_2.setToolTip('This is action 2')
            action_3 = menu.addAction('Action3')
            action_3.setToolTip('This is action 3')
            action_4 = menu.addAction('Action4')
            action_4.setToolTip('This is action 4')
    
            action_1.hovered.connect(lambda pos = [self], parent = action_1, index = 0: show_toolTip(pos, parent, index))
            action_2.hovered.connect(lambda pos = [self], parent = action_2, index = 1: show_toolTip(pos, parent, index))
            action_3.hovered.connect(lambda pos = [self], parent = action_3, index = 2: show_toolTip(pos, parent, index))
            action_4.hovered.connect(lambda pos = [self], parent = action_4, index = 3: show_toolTip(pos, parent, index))
    
            self.setMenu(menu)
            self.show()
    
    def show_toolTip(pos, parent, index):
        '''
        **Parameters**
            pos:    list
                list of all parent widget up to the upmost
    
            parent: PySide.QtGui.QAction
                the parent QAction
    
            index:  int
                place within the QMenu, beginning with zero
        '''
        position_x = 0
        position_y = 0
        for widget in pos:
            position_x += widget.pos().x()
            position_y += widget.pos().y()
    
        point = QtCore.QPoint()
        point.setX(position_x)
        point.setY(position_y + index * 22) # set y Position of QToolTip
    
        QtGui.QToolTip.showText(point, parent.toolTip())
    
    def main():
        app = QtGui.QApplication(sys.argv)
        ex = Example()
    
        app.exec_()
    
    if __name__ == '__main__':
        main()
    

    我不得不说我对此并不完全满意,主要是因为show_toolTip 函数必须是全局的,因为当我在课堂上使用 lambda 运算符时 (self.show_toolTip) 无法识别它。如果有人有建议,我仍然愿意接受建议。

    【讨论】:

    • 不确定您是否仍然感兴趣,但我已经为我的答案添加了一个更简单的解决方案。
    【解决方案4】:

    您可以在悬停时更新父(菜单)的工具提示,然后等待显示工具提示,而不是立即显示工具提示!因此:

        menu = QtGui.QMenu(self)
        action_1 = menu.addAction('Action1')
        action_1.setToolTip('This is action 1')
        ...
        menu.hovered.connect(self.handleMenuHovered)
    
    def handleMenuHovered(self, action):
        action.parent().setToolTip(action.toolTip())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多