【发布时间】:2017-10-30 03:01:06
【问题描述】:
我需要创建几个可移动、可选择的图形项目。一个项目保持选中状态,直到选择了不同的项目或用户单击场景的空白部分,取消选择所有项目。选定的项目必须与未选定的项目看起来不同。主窗口的任何小部件都应该能够查询是否选择了一个图形项以及——如果是——是哪一个。
此代码允许在屏幕上选择和移动项目。移动时项目变为红色:
import sys
from PySide import QtGui, QtCore
class MainWindowUi(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.scene = Scene(0, 0, 300, 300, self)
self.view = QtGui.QGraphicsView()
self.setCentralWidget(self.view)
self.view.setScene(self.scene)
self.scene.addItem(Line(25,25,25,50))
self.scene.addItem(Line(30,30,30,70))
self.scene.addItem(Line(35, 40, 35, 65))
class Scene(QtGui.QGraphicsScene):
pass
class Line(QtGui.QGraphicsLineItem):
def __init__(self, *args):
QtGui.QGraphicsLineItem.__init__(self)
self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
self.setPen(QtGui.QPen(QtCore.Qt.black, 3))
def mousePressEvent(self, e):
self.setPen(QtGui.QPen(QtCore.Qt.red, 5))
QtGui.QGraphicsLineItem.mousePressEvent(self, e)
def mouseReleaseEvent(self, e):
self.setPen(QtGui.QPen(QtCore.Qt.black, 3))
QtGui.QGraphicsLineItem.mouseReleaseEvent(self, e)
if __name__ == '__main__':
a = QtGui.QApplication(sys.argv)
m = MainWindowUi()
m.show()
sys.exit(a.exec_())
这是我的问题:
在 Qt 中,图形项是在移动时被选中,在释放时被取消选中?
鼠标释放后如何保持选中图形项?例如,我应该在“Line”中创建一个名为 self.selected 的布尔变量吗?
应用程序如何查询选择了哪个图形项并区分它们?例如,是否应该为“Line”类中的每个项目分配一个唯一的 ID,还是 Qt 已经这样做了?
【问题讨论】:
标签: python pyside qgraphicsscene