11

で書かれたGUIでアプリをやっていPySideます。に を設定し、QMenuを介してQPushButtonいくつか追加しました。これらのアクションをユーザーにさらに説明するために、これらに を追加しました。QActionsQMenu.addActionQToolTipQAction.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()
4

4 に答える 4

18

Qt-5.1 以降では、QMenu.setToolTipsVisibleを使用するだけで、メニュー項目にツールチップが期待どおりに表示されます ( QTBUG-13663を参照)。

    menu.setToolTipsVisible(True)

ただし、Qt-4.* と Qt-5.0 の場合は状況が異なります。アクションがツールバーに追加されると、そのツールチップ表示されます。しかし、同じアクションが に追加された場合QMenu、そうはならず、それを変更するための組み込み API はありません。これを回避するには、いくつかの方法があります。1 つは、代わりにステータス ヒントを使用することです。これにより、ステータス バーにメニュー項目の情報が表示されます。もう 1 つは、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))
于 2014-02-12T20:49:56.030 に答える
2

エクモロが途中で私を助けてくれて、この解決策にたどり着きました。これはおそらく最も美しいものではありません。以下のコードでは、メニューとツール ヒントがややぎこちなく配置されていますが、実際のプログラムではかなりきれいに見えます。

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関数がグローバルでなければならないためです。これは、ラムダ演算子がクラス ( ) にあるときにそれを認識しなかったためself.show_toolTipです。誰かが提案を持っている場合、私はまだ提案を受け付けています。

于 2014-02-13T09:33:00.400 に答える
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())
于 2016-11-17T09:07:50.380 に答える