1

我正在尝试对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
}

主文件

#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或其他任何东西让我继续编辑文本?

4

1 回答 1

1

您需要关注QGraphicsView格式更改后的内容。你不能专注,QGraphicsTextItem因为它不是QWidget

于 2015-09-11T09:19:01.910 回答