Отредактируйте 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. Спасибо!


person Qlaus    schedule 24.05.2012    source источник


Ответы (1)


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

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

person bootchk    schedule 12.03.2013