Как продолжить редактирование текста после изменения форматирования QGraphicsTextItem?

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

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

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

заголовок: mytextitem.h

#include <QGraphicsTextItem>

class MyTextItem : public QGraphicsTextItem
{
Q_OBJECT
public:
    MyTextItem();
    ~MyTextItem() {}
public slots:
    void setItemBold(const int b);
};

mytextitem.cpp

#include "mytextitem.h"
#include <QTextCursor>

MyTextItem::MyTextItem()
{
    setPlainText("ABCD");
    setFont(QFont("Arial", 20));
    setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable);
    setTextInteractionFlags(Qt::TextEditorInteraction);
}
void MyTextItem::setItemBold(const int b)
{
    int _weight = (b != 0) ? QFont::Bold : QFont::Normal;
    QTextCursor _cursor = textCursor();
    //int p = _cursor.position();     // this won't help
    QTextCharFormat _format = _cursor.charFormat();
    _format.setFontWeight(_weight);
    _cursor.setCharFormat(_format);
    //_cursor.setPosition(p, QTextCursor::KeepAnchor);  // makes no difference on allowing me to type, but I can make the cursor move
    //_cursor.movePosition(QTextCursor::NoMove, QTextCursor::KeepAnchor, 0); // makes no difference but I just thought some action might
    setTextCursor(_cursor);
    setFocus(Qt::MouseFocusReason);
    // grabKeyboard();  // does nothing
}

main.cpp

#include <QApplication>
#include <QGraphicsView>
#include <QGridLayout>
#include <QtWidgets>
#include <QCheckBox>
#include "mytextitem.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene(-20, -20, 150, 100);
    QGraphicsView view(&scene);
    QWidget widget;
    QGridLayout layout(&widget);
    layout.addWidget(&view, 0, 0);
    QCheckBox bold("Bold");
    layout.addWidget(&bold, 0, 1);
    MyTextItem* item = new MyTextItem();
    scene.addItem(item);
    QObject::connect(&bold, SIGNAL(stateChanged(int)), item, SLOT(setItemBold(int)));
    view.ensureVisible(scene.sceneRect());
    widget.show();
    return a.exec();
}

Редактирование элемента возможно только при нажатии на поле.

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

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

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

Как я могу получить QTextCursor или что-нибудь еще, чтобы позволить мне продолжать редактировать текст?

1 ответ

Решение

Вы должны сосредоточиться на QGraphicsView после изменения формата. Вы не можете сосредоточиться на QGraphicsTextItem потому что это не QWidget,

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