Как я могу заставить свою каретку отображаться при первом двойном щелчке в QGraphicsTextItem?

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

Моя проблема в том, что курсор не отображается при первом редактировании.
Я попытался получить положение на основе положения мыши (как в этом вопрос, который пытался решить другую проблему), или вызывая QGraphicsTextItem::mouseDoubleClickEvent(event);

Независимо от того, что я пытаюсь сделать, курсор невидим при первом действии - пока я не начну печатать (или если я не сфокусируюсь и не вернусь) - даже если он находится в правильном месте.

После ввода или отмены выбора и повторного выбора курсор каждый раз появляется в обычном месте.

Я попытался вызвать QTextCursor в конструкторе элемента, установив его позицию на 0, без разницы.

Что имело значение: одна из двух ситуаций (ни одну из которых я не могу сделать):
а) начать элемент с Qt::TextEditorInteraction в конструкторе
б) запустить элемент без флагов перемещения/фокуса/выбора

Я тоже не могу этого сделать, потому что мое состояние элемента по умолчанию должно быть подвижным, а это мешает редактированию текста (как объяснялось в начале).
Я пытался отключить эти флаги во время редактирования... безрезультатно.

Вот простой код для демонстрации проблемы, я надеюсь, что у кого-то есть идея.

mytextitem.h

#ifndef TEXTITEM_H
#define TEXTITEM_H
#include <QGraphicsTextItem>

class MyTextItem : public QGraphicsTextItem
{
Q_OBJECT
public:
    MyTextItem();
protected:
    virtual void focusOutEvent (QFocusEvent * event);
    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event);
};
#endif // TEXTITEM_H

mytextitem.cpp

#include "mytextitem.h"
#include <QTextCursor>
#include <QAbstractTextDocumentLayout>
#include <QGraphicsSceneMouseEvent>
#include <QFont>

MyTextItem::MyTextItem()
{
    setHtml("ABCD");
    setFont(QFont("Arial", 50));
    setTextInteractionFlags(Qt::NoTextInteraction);
    setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable);
}

void MyTextItem::focusOutEvent(QFocusEvent *event)
{
    Q_UNUSED(event);
    setTextInteractionFlags(Qt::NoTextInteraction);
    QTextCursor _cursor = textCursor();
    _cursor.clearSelection();
    setTextCursor(_cursor);
}

void MyTextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
    setTextInteractionFlags(Qt::TextEditorInteraction);
    QGraphicsTextItem::mouseDoubleClickEvent(event);   // or the version in linked question
}

main.cpp

int main(int argc, char *argv[])
{

    QApplication app(argc, argv);
    QGraphicsScene s;
    QGraphicsView view(&s);
    s.setSceneRect(-20, -100, 800, 600);
    view.show();
    MyTextItem* t = new MyTextItem();
    s.addItem(t);
    return app.exec();
}

Я также подумал о редактировании текста - не уверен, что это сработает, но я думаю, что это повлияет на стек отмены, с которым мне скоро придется иметь дело....

Как я могу заставить свою каретку отображаться при первом двойном щелчке по текстовому элементу?

(Как пользователь, отсутствие знака вставки заставит меня сомневаться, смогу ли я печатать... даже несмотря на то, что это работает... Я не был бы уверен в объекте, если бы у меня не было обратной связи о моем действии. Вот почему я забочусь о Эта проблема.)


person Thalia    schedule 01.09.2015    source источник


Ответы (1)


Я не могу это объяснить... после ВСЕХ попыток показать каретку решение было таким простым:
Мне пришлось изменить порядок установки флагов в конструкторе.

Флаг QGraphicsTextItem должен быть установлен ПОСЛЕ установки флагов QGraphicsItem.

setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable);
setTextInteractionFlags(Qt::NoTextInteraction);
person Thalia    schedule 01.09.2015