Python 使用PySide选择QGraphicscene中的项目?
我需要创建几个可移动、可选择的图形项。项目保持选中状态,直到选择了其他项目,或者直到用户单击场景的空白部分,取消选择所有项目。所选项目的外观必须与未选项目的外观不同。主窗口的任何小部件都应该能够查询是否选择了图形项,如果选择了,则查询哪个图形项 此代码允许在屏幕上选择和移动项目。移动时,项目将变为红色:Python 使用PySide选择QGraphicscene中的项目?,python,pyside,qgraphicsscene,Python,Pyside,Qgraphicsscene,我需要创建几个可移动、可选择的图形项。项目保持选中状态,直到选择了其他项目,或者直到用户单击场景的空白部分,取消选择所有项目。所选项目的外观必须与未选项目的外观不同。主窗口的任何小部件都应该能够查询是否选择了图形项,如果选择了,则查询哪个图形项 此代码允许在屏幕上选择和移动项目。移动时,项目将变为红色: import sys from PySide import QtGui, QtCore class MainWindowUi(QtGui.QMainWindow): def __ini
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_())
以下是我的问题:
selected()
已返回True或False以及项目是否选中
应用程序如何查询选定的图形项和
区分它们?例如,类中的每个项目
“行”应该被分配一个唯一的ID,还是Qt已经这样做了
qgraphicscene
具有返回所选项目的selectedItems()
方法。Qt不提供ID或类似的东西,为了执行该任务,我们可以使用setData()
和data()
方法,第一个方法通过一个键保存一些信息,另一个方法使用相同的键恢复信息
要检测项目中的更改,必须覆盖itemChange()
方法,这将为我们提供更改类型和此更改的值。在您的情况下,您应该验证更改必须是ItemSelectedChange
类型,如果选中,则为True;如果取消选中,则为False
def itemChange(self, change, value):
if change == QtGui.QGraphicsItem.ItemSelectedChange:
if value:
self.setPen(QtGui.QPen(QtCore.Qt.red, 3))
else:
self.setPen(QtGui.QPen(QtCore.Qt.black, 3))
return QtGui.QGraphicsLineItem.itemChange(self, change, value)
例如:
class MainWindowUi(QtGui.QMainWindow):
def __init__(self, *args, **kwargs):
QtGui.QMainWindow.__init__(self, *args, **kwargs)
self.scene = Scene(0, 0, 300, 300, self)
self.view = QtGui.QGraphicsView(self)
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))
self.scene.selectionChanged.connect(self.onSelectionChanged)
def onSelectionChanged(self):
message = "Items selecteds: "
for item in self.scene.selectedItems():
message += " " + item.data(Scene.NameItem)
self.statusBar().showMessage(message)
class Scene(QtGui.QGraphicsScene):
NameItem = 1
def __init__(self, *args, **kwargs):
QtGui.QGraphicsScene.__init__(self, *args, **kwargs)
self.counterItems = 0
def addItem(self, item):
item.setData(Scene.NameItem, "item {}".format(self.counterItems))
self.counterItems += 1
QtGui.QGraphicsScene.addItem(self, item)
class Line(QtGui.QGraphicsLineItem):
def __init__(self, *args, **kwargs):
QtGui.QGraphicsLineItem.__init__(self, *args, **kwargs)
self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
self.setPen(QtGui.QPen(QtCore.Qt.black, 3))
def itemChange(self, change, value):
if change == QtGui.QGraphicsItem.ItemSelectedChange:
if value:
self.setPen(QtGui.QPen(QtCore.Qt.red, 3))
else:
self.setPen(QtGui.QPen(QtCore.Qt.black, 3))
return QtGui.QGraphicsLineItem.itemChange(self, change, value)
在Qt中,图形项目是否在移动时选中,在移动时取消选中
释放
否,默认情况下,鼠标单击时会选中qgraphics
项目,即使松开鼠标,该项目也会保持选中状态
释放鼠标后,图形项目如何保持选中状态?对于
例如,我应该在“Line”中创建一个布尔变量,名为
自选的
一个qgraphics
项知道它是否被选中,你可以要求它查询它的isSelected()
方法
应用程序如何查询选定的图形项和
区分它们?例如,类中的每个项目
“行”应该被分配一个唯一的ID,还是Qt已经这样做了
从应用程序的角度来看,它可以调用qgraphicscene::selectedItems()
方法获取所有选定项
您可以阅读描述如何使用它的手册。谢谢。您演示的
item.setData()
也很有帮助。没有区别:当我发布时,我看到您在写我的邮件的同时回答了问题。