2014-02-12 18 views
7

Ich mache eine App mit in GUI geschrieben mit PySide. Ich setzte einen QMenu auf einen QPushButton, fügte mehrere QActions über QMenu.addAction hinzu. Um diese Aktionen dem Benutzer näher zu erläutern, fügte ich QToolTip zu diesen mit QAction.setToolTip hinzu.Warum QToolTips nicht in QActions innerhalb eines QMenu erscheinen

Wenn ich die GUI jetzt laufen lasse, wird meine QToolTip nicht angezeigt. Das unten angegebene Beispiel reproduziert das gleiche Problem, irgendwelche Ideen?

Vielen Dank im Voraus

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

Antwort

7

In Qt-5.1 oder höher, können Sie einfach QMenu.setToolTipsVisible verwenden, und die Menüpunkte ihre Tooltips wie erwartet zeigen (siehe QTBUG-13663):

menu.setToolTipsVisible(True) 

jedoch Für Qt-4. * und Qt-5.0 ist die Situation anders. Wenn eine Aktion zu einer Werkzeugleiste hinzugefügt wird, wird ihr Tooltip angezeigt; Aber wenn die gleiche Aktion zu einer QMenu hinzugefügt wird, wird es nicht, und es gibt keine integrierte API, um das zu ändern. Es gibt ein paar Möglichkeiten, dies zu umgehen. Eine besteht darin, stattdessen status tips zu verwenden, was die Menüelement-Information in der Statusleiste anzeigt. Der andere ist der Menüpunkt Tooltip Funktionalität sich mit dem QMenu.hovered Signal und QToolTip.showText zu implementieren:

 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

Danke, wahrscheinlich nicht die Antwort, die ich gesucht habe;) - aber es half mir sicherlich auf dem Weg !! Ich poste meine Lösung unter –

+0

Vielen Dank! Das funktioniert einwandfrei –

+0

Die nächste Antwort (mit setToolTipsVisible auf dem QMenu) ist eigentlich die richtige Antwort für Qt 5.1+. – Wingware

2

Mit ekhumoro hilft mir auf dem Weg zu dieser Lösung. Es ist wahrscheinlich nicht das Schönste, und der unten stehende Code positioniert das Menü und die Tooltipps etwas arktisch, aber in meinem eigentlichen Programm sieht es ziemlich ordentlich aus.

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

Ich muss sagen, dass ich mit diesem nicht vollkommen zufrieden bin, vor allem, weil die show_toolTip Funktion für den Lambda-Operator global, sein muss hat es nicht erkennen, wenn ich es in der Klasse hatte (self.show_toolTip). Ich bin immer noch offen für Suggestions, wenn jemand einen Vorschlag hat.

+0

Nicht sicher, ob Sie immer noch interessiert sind, aber ich habe eine einfachere Lösung für meine Antwort hinzugefügt. – ekhumoro

2

Anstatt den Tooltip sofort anzuzeigen, kann man einfach den Tooltip des übergeordneten Elements (Menü) aktualisieren, wenn man den Mauszeiger berührt, und warten, bis der Tooltip angezeigt wird! Deshalb:

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

Eigentlich müssen Sie keine Abhilfe tun, um Ihren Tooltip angezeigt werden, da Qt 5.1 können Sie QMenu Eigentum toolTipsVisible verwenden, die standardmäßig auf false gesetzt ist.

Siehe related Qt suggestion.

+0

Dies funktioniert wirklich und sollte die akzeptierte Lösung sein, Sie müssen sicherstellen, dass diese Eigenschaft für jedes Menü und Untermenü in Ihrer Anwendung aktiviert ist oder die Tooltips für diese Menüs nicht angezeigt werden – ejectamenta