Редактировать QGraphicsTextItem внутри QGraphicsItemGroup

Я хочу приложение на python, которое отображает кучу маленьких портретов и имена под ним. Как это:Вот так выглядит приложение

Они должны быть подвижными и редактируемыми (двойным щелчком по тексту).

Я использую PyQt4, поэтому я понял, что было бы проще всего использовать 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)

Но есть некоторые проблемы:

  • Редактирование текста запускается одним щелчком мыши, но я хочу двойной щелчок (возможно, дубликат этого).
  • Вы не можете использовать мышь, чтобы выделить текст или переместить курсор, потому что тогда перемещается вся группа.
  • Если вы остановите редактирование, курсор не исчезнет. (Хотя я знаю, как это сделать, если я найду способ активировать и деактивировать режим редактирования)

Я попытался поймать сигнал двойного щелчка и переключиться в режим редактирования, который перенаправляет все события мыши в текст. Но я не смог активировать процесс редактирования двойным щелчком, и, кроме того, я не смог сохранить поведение, чтобы завершить редактирование, щелкнув где-то еще.

Поэтому я надеюсь, что кто-то может мне помочь. Может быть достаточно знать, как вручную активировать и деактивировать режим взаимодействия текста QGraphicsTextItem, Спасибо!

1 ответ

Вероятно, вам следует вызвать QGraphicsItemGroup::setHandlesChildEvents(false).

Смотрите вопрос SO События с QGraphicsItemGroup

Другие вопросы по тегам