我在使用PySide
编写的GUI中创建应用程序。我在QMenu
上设置了QPushButton
,并通过QActions
添加了多个QMenu.addAction
。为了进一步向用户解释这些操作,我使用QToolTip
将QAction.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()
答案 0 :(得分:9)
在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))
答案 1 :(得分:4)
实际上,您无需执行任何变通方法来显示工具提示,因为从Qt 5.1开始,您可以使用QMenu的属性toolTipsVisible
,默认设置为false
答案 2 :(得分:2)
随着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运算符无法识别它({{1 }})。如果有人有建议,我仍然愿意接受建议。
答案 3 :(得分:2)
不是立即显示工具提示,而是可以在悬停时更新父级(菜单)的工具提示,并等待显示工具提示!因此:
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())