Qt QGraphicsView - 工具提示不显示



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

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

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

第二次我以为这是板上钉钉的事,但似乎什么都没做。。。

使用pythonQt 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_())

据推测,你自己的代码中一定有一些不同的东西在损害正常行为。但是,如果没有一个合适的测试用例,这将是不可能识别的。

好吧,多亏@ekhumuromo促使我对问题采取更合乎逻辑的方法,我已经确定了问题。

这个问题是由于继承结构,以及我对减少代码重复的过度热情。我把它提炼成了一个(非)工作的例子,它看起来比原始代码更愚蠢(或者可能只是揭示了愚蠢):

    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的构造函数两次,并且setToolTip需要在这两个构造函数的之后调用。

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

最新更新