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_())
以下是我的问题:

  • 在Qt中,图形项目在移动时是否选中,在释放时是否取消选中

  • 释放鼠标后,图形项目如何保持选中状态?例如,我应该在“Line”中创建一个名为self.selected的布尔变量吗

  • 应用程序如何查询选定的图形项并区分它们?例如,类“行”中的每个项都应该分配一个唯一的ID,还是Qt已经这样做了

  • 在Qt中,图形项目是否在移动时选中,在移动时取消选中 释放

    单击某个项目时会选中该项目,选择其他项目或单击空白区域时会取消选中该项目

    释放鼠标后,图形项目如何保持选中状态?对于 例如,我应该在“Line”中创建一个布尔变量,名为 自选的

    从上一个答案中,元素保持选中状态,此外,函数
    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()
    也很有帮助。没有区别:当我发布时,我看到您在写我的邮件的同时回答了问题。