Я изо всех сил пытаюсь заставить 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();
}
Я также подумал о редактировании текста - не уверен, что это сработает, но я думаю, что это повлияет на стек отмены, с которым мне скоро придется иметь дело....
Как я могу заставить свою каретку отображаться при первом двойном щелчке по текстовому элементу?
(Как пользователь, отсутствие знака вставки заставит меня сомневаться, смогу ли я печатать... даже несмотря на то, что это работает... Я не был бы уверен в объекте, если бы у меня не было обратной связи о моем действии. Вот почему я забочусь о Эта проблема.)