Для редактирования QGraphicsTextItem необходимо выполнить действие дважды

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

#include <QApplication>
#include <QPainter>
#include <QGraphicsItem>
#include <QGraphicsView>

class TextItem: public QGraphicsTextItem
{
public:
TextItem()
{
setPlainText("hello world");
QFont f;
f.setPointSize(50);
f.setBold(true);
f.setFamily("Helvetica");
setFont(f);

setFlags(QGraphicsItem::ItemIsMovable    |
QGraphicsItem::ItemIsFocusable  |
QGraphicsItem::ItemIsSelectable);
setTextInteractionFlags(Qt::NoTextInteraction);
}
virtual void paint(QPainter* painter,
const QStyleOptionGraphicsItem* option,
QWidget* widget = NULL)
{
QGraphicsTextItem::paint(painter, option, widget);
}

protected:
virtual void focusOutEvent (QFocusEvent * event)
{
Q_UNUSED(event);
setTextInteractionFlags(Qt::NoTextInteraction);
}
virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event)
{
Q_UNUSED(event);
setTextInteractionFlags(Qt::TextEditable); // TextEditorInteraction
}
};

int main(int argc, char *argv[])
{
QApplication  a(argc, argv);
TextItem* t = new TextItem();
QGraphicsView view(new QGraphicsScene(-200, -150, 400, 300) );
view.scene()->addItem(t);
view.show();
return a.exec();
}

Он делает то, что я хочу — за исключением того, что я должен дважды щелкнуть дважды
— при первом двойном щелчке я вижу курсор, но не могу редактировать текст TextEditable или же TextEditorInteraction (Я, наверное, хочу последнее). Затем я снова дважды щелкаю и могу напечатать, чтобы добавить или удалить текст.

Это поведение, которого пользователь, вероятно, не ожидает, и, похоже, я ничего не изменяю.

Я что-то делаю не так или мне нужно что-то добавить?

1

Решение

Я ожидал, что действие мыши на фокусируемом элементе автоматически сфокусируется. Я думаю, нет …

в mouseDoubleClickEventЯ добавил звонок setFocus()

virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event)
{
Q_UNUSED(event);
setTextInteractionFlags(Qt::TextEditorInteraction);
setFocus();
}
0

Другие решения