我正在使用QGraphicsView在PyQt中创建一个2D视图。不幸的是,我似乎找不到任何方法让工具提示出现在任何级别上——在QGraphicsItems、QGraphicsIItemGroup等上。
已经到了它们非常有用的地步,但我已经尝试过了:
- 使用setToolTip()设置工具提示
- 在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的重复继承。。。