Qt QGraphicsView - 工具提示不出现

问题描述 投票:0回答:2

我正在使用 QGraphicsView 在 PyQt 中创建 2D 视图。不幸的是,我似乎找不到任何方法让工具提示出现在任何级别 - 在 QGraphicsItems、QGraphicsItemGroups 等上。

它们已经到了非常有用的地步,但我已经尝试过:

  1. 使用 setToolTip() 设置工具提示。
  2. 在 QGraphicsView 上使用 setAttribute(QtCore.Qt.WA_AlwaysShowToolTips)

我认为第二个是肯定的,但似乎什么也没做......

python pyqt tooltip qgraphicsview
2个回答
2
投票

使用 python Qt 4.8.7 和 PyQt 4.11.4 似乎可以按预期工作:

from PyQt4 import QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.view = QtGui.QGraphicsView(self)
        self.view.setScene(QtGui.QGraphicsScene(self))
        for index, name in enumerate('One Two Three Four Five'.split()):
            item = QtGui.QGraphicsRectItem(index * 60, index * 60, 50, 50)
            item.setToolTip('Rectangle: ' + name)
            self.view.scene().addItem(item)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.view)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(400, 400)
    window.show()
    sys.exit(app.exec_())

据推测,您自己的代码中一定存在某些不同的地方,从而损害了正常行为。但如果没有适当的测试用例,这是不可能识别的。


1
投票

好的,感谢@ekhumoro 提示我采取更合乎逻辑的方法来解决问题,我已经确定了问题。

问题是由于继承结构和我过于热心地尝试减少代码重复造成的。我将其提炼成一个(非)工作示例,它看起来比原始代码更愚蠢(或者可能只是揭示了愚蠢):

    from PyQt4 import QtGui
    
    class MyRect(QtGui.QGraphicsRectItem, QtGui.QGraphicsItem):
        def __init__(self, index):
            QtGui.QGraphicsItem.__init__(self, )
            self.setToolTip('Rectangle: '+str(index))    # <-- This doesn't work
            QtGui.QGraphicsRectItem.__init__(self, index * 60, index * 60, 50, 50)
            #self.setToolTip('Rectangle: '+str(index))     <-- This works
    
    
    class Window(QtGui.QWidget):
        def __init__(self):
            super(Window, self).__init__()
            self.view = QtGui.QGraphicsView(self)
            self.view.setScene(QtGui.QGraphicsScene(self))
            for index, name in enumerate('One Two Three Four Five'.split()):
                item = MyRect(index)
                #item.setToolTip('Rectangle: ' + name)    # <-- This would work
                self.view.scene().addItem(item)
            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.view)
    
    if __name__ == '__main__':
        import sys
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.resize(400, 400)
        window.show()
        sys.exit(app.exec_())

最初的努力是尝试将所有日常事务(例如设置工具提示和上下文菜单)提取到继承自 QGraphicsItem 的抽象类中。然而,这意味着您调用了 QGraphicsItem 的构造函数两次,并且需要在构造函数的 both 之后调用 setToolTip 。

不用说,我正在重构代码以删除 QGraphicsItem 的重复继承...

© www.soinside.com 2019 - 2024. All rights reserved.