2014-02-12 26 views
7

內我在做一個應用程序,在與PySide編寫GUI。我在QPushButton設置QMenu,通過QMenu.addAction增加了幾個QActions。爲了進一步向用戶解釋這些行爲,我向QAction.setToolTip添加了QToolTip爲什麼不會QToolTips出現在QActions一個QMenu

當我現在運行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() 

回答

7

在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)) 
+0

謝謝,可能不是我一直在尋找的答案;) - 但它確實幫助我獲得的方式!我會在 –

+0

以下發布我的解決方案非常感謝!這很好用 –

+0

下一個答案(在QMenu上使用setToolTipsVisible)實際上是Qt 5.1+的正確答案。 – Wingware

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運營商不承認它,當我在課堂上(self.show_toolTip)了吧。如果有人有建議,我仍然樂意提供建議。

+0

不確定你是否仍然感興趣,但我已經爲我的答案添加了一個更簡單的解決方案。 – ekhumoro

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()) 
4

其實你不必做任何變通方法,以顯示你的提示,因爲Qt的5.1,你可以使用QMenu財產toolTipsVisible,這是默認設置爲false

related Qt suggestion

+0

這真的起作用,應該是可以接受的解決方案,您必須確保檢查此屬性是否適用於您的應用程序中的每個菜單和子菜單,否則將不會顯示這些菜單的工具提示 – ejectamenta