我正在使用 QGraphicsView 在 PyQt 中创建 2D 视图。不幸的是,我似乎找不到任何方法让工具提示出现在任何级别 - 在 QGraphicsItems、QGraphicsItemGroups 等上。
它们已经到了非常有用的地步,但我已经尝试过:
我认为第二个是肯定的,但似乎什么也没做......
使用 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_())
据推测,您自己的代码中一定存在某些不同的地方,从而损害了正常行为。但如果没有适当的测试用例,这是不可能识别的。
好的,感谢@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 的重复继承...