Skip to main content
 首页 » 编程设计

python之在 QGraphicsItemGroup 中编辑 QGraphicsTextItem

2025年05月04日10bluestorm

我想要一个 python 应用程序,它显示一堆小肖像和下面的名字。像那样:

它们应该是可移动和可编辑的(通过双击文本)。

我正在使用 PyQt4,所以我发现,为 Canvas 使用 QGraphicsView 和 QGraphicsScene 是最简单的。所以我像这样子类化了一个 QGraphicsItemGroup:

from PyQt4 import QtCore, QtGui 
class Speaker(QtGui.QGraphicsItemGroup): 
    def __init__(self, name, parent=None): 
        QtGui.QGraphicsItemGroup.__init__(self, parent) 
 
        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable) 
        self.text = QtGui.QGraphicsTextItem(name) 
        self.text.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction) 
        self.addToGroup(self.text) 
        self.portrait = QtGui.QGraphicsPixmapItem(QtGui.QPixmap("portrait.png")) 
        self.portrait.setY(-35) 
        self.addToGroup(self.portrait) 
 
    def keyPressEvent(self, QKeyEvent): 
        # Forwarding KeyPress events to the text to enable text editing 
        self.text.keyPressEvent(QKeyEvent) 

但是有一些问题:

  • 文本编辑由单击触发,但我想双击(可能与 this 重复)。
  • 您不能使用鼠标选择文本或移动光标,因为整个组都会随之移动。
  • 如果您停止编辑,光标不会消失。 (虽然我知道该怎么做,但如果我找到激活和停用编辑模式的方法)

我试图捕获双击信号并切换到将所有鼠标事件转发到文本的编辑模式。但是我无法通过双击激活编辑过程,而且我无法保留通过单击其他地方结束编辑的行为。

所以我希望有人能帮助我。知道如何手动激活和停用 QGraphicsTextItem 的文本交互模式可能就足够了。谢谢!

请您参考如下方法:

也许你应该调用 QGraphicsItemGroup::setHandlesChildEvents(false)。

参见 SO 问题 Events with QGraphicsItemGroup