在 returnPressed 时从 QGraphicsScene 中删除 QLineEdit 代理小部件

Posted

技术标签:

【中文标题】在 returnPressed 时从 QGraphicsScene 中删除 QLineEdit 代理小部件【英文标题】:Removing QLineEdit proxy widget from QGraphicsScene on returnPressed 【发布时间】:2016-06-12 03:25:20 【问题描述】:

当 QGraphicsTextItem 添加到场景中时,我想做的是在我的 QGraphicsView 中出现 QLineEdit。行编辑仅用于设置双击时QGraphicsItem的文本,需要在按下返回键时删除。

我无法删除 QLineEdit。我试过在按下返回键时简单地删除它,但它仍然没有被删除。这是重现此行为的代码:

class Text(QGraphicsTextItem):

    def __init__(self, text, position=QPointF(0,0), parent=None, scene=None):
        super().__init__(text, parent=parent, scene=scene)

        self.parent = parent

        self.setFlag(QGraphicsItem.ItemIsSelectable, True)

        self.height = self.document().size().height()
        self.width = self.document().size().width()
        self.text_center = QPointF(-self.width/2, -self.height/2)

        if parent:
            self.parent_center = self.parent.boundingRect().center()
            self.scene = self.parent.scene
            self.setPos(text_center)
        else:
            self.setFlag(QGraphicsItem.ItemIsMovable)
            self.scene = scene
            self.setPos(position - self.text_center)

    def mouseDoubleClickEvent(self, mouseEvent):
        self.Editing = True
        self.nameEdit = NameEditor(self)
        self.nameEditProxy = self.scene.addWidget(self.nameEdit)
        self.nameEditProxy.setPos(self.mapToScene(QPointF(0, 0)))


class NameEditor(QLineEdit):

    def __init__(self, textItem):
        super().__init__(textItem.toPlainText())

        self.setMaximumWidth(200)
        self.setFixedWidth(200)
        self.selectAll()
        self.grabKeyboard()

        self.textItem = textItem

    def returnPressed(self):
        self.textItem.setPlainText(self.text())
        del self


if __name__ == "__main__":

    app = QApplication(sys.argv)

    view = QGraphicsView()
    scene = QGraphicsScene()
    scene.setSceneRect(0, 0, 500, 500)
    view.setScene(scene)

    text = Text("Example", position=QPointF(250, 250), scene=scene)

    view.show()

    sys.exit(app.exec_())

在这次尝试中,我在returnPressed 方法中通过del self 删除了子类QLineEdit。我还尝试通过del self.nameEditProxyText 类的mouseDoubleClick 方法中删除包含它的QGraphicsProxyWidget。

我的问题是如何在 returnPressed 上删除 QLineEdit?

【问题讨论】:

【参考方案1】:

在 Qt 中,从屏幕上移除小部件的一种简单方法是隐藏它们,也就是说,如果您不担心的话;也许你只是想摆脱它,否则使用

myWidget.setVisible(False)

myWidget.hide();

您可以通过调用重复使用该小部件

myWidget.setVisible(True)

myWidget.show()

然后将其重新定位到您想要的任何位置。

【讨论】:

啊,好吧,看来我没有将returnPressed 信号连接到任何东西(甚至没有想过......)。不过我喜欢这个建议,并会在修改后发表评论/编辑。

以上是关于在 returnPressed 时从 QGraphicsScene 中删除 QLineEdit 代理小部件的主要内容,如果未能解决你的问题,请参考以下文章

qgraph:更改图形类型时如何修复节点位置?

QLineWidget returnPressed 信号不起作用

在写入时从 ByteArrayOutputStream 读取

如何在迭代字典时从字典中删除项目?

在运行时从静态 UITableView 中删除行

如何在运行时从 nhibernate 映射文件生成实体类