QGraphicsTextItem 的格式更改后如何继续文本编辑?
How to continue text editing after formatting changes of QGraphicsTextItem?
我正在尝试对可编辑的 QGraphicsTextItem
进行更改(字体更改)。
我正在尝试更改文本片段的格式,或在键入点应用的格式(如果我将文本设置为粗体,则我在该操作后在光标位置键入的文本将是粗体)。
设置文本片段的格式有效 - 但我找不到方法 return 将焦点正确地放在项目上。
我可以在正确的位置显示插入符号,但我无法在框中键入内容,除非我实际单击框内(尽管看起来我应该能够)。
简单示例(由于某种原因它在关闭程序时崩溃,但我不关心这个,因为我正在测试文本 class,而不是主程序):
header: 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();
}
只有在框中单击才能编辑项目。
假设我已经在框中(编辑),并且我按下 "Bold" 复选框,我希望能够继续编辑 - 在框中键入 - 但即使我尝试
- 设置焦点(将闪烁的文本光标放在框中),
- 设置光标的位置(我可以移动它,或者 select 东西...可行,但我想保持当前位置和 selection)
- 抓住键盘 - 似乎什么也没做
我似乎 return 没有任何内容,所以我继续输入(使用新字体设置)。
我怎样才能得到 QTextCursor
或其他任何东西来让我继续编辑文本?
格式更改后您需要关注 QGraphicsView
。你不能关注 QGraphicsTextItem
因为它不是 QWidget
.
我正在尝试对可编辑的 QGraphicsTextItem
进行更改(字体更改)。
我正在尝试更改文本片段的格式,或在键入点应用的格式(如果我将文本设置为粗体,则我在该操作后在光标位置键入的文本将是粗体)。
设置文本片段的格式有效 - 但我找不到方法 return 将焦点正确地放在项目上。
我可以在正确的位置显示插入符号,但我无法在框中键入内容,除非我实际单击框内(尽管看起来我应该能够)。
简单示例(由于某种原因它在关闭程序时崩溃,但我不关心这个,因为我正在测试文本 class,而不是主程序):
header: 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();
}
只有在框中单击才能编辑项目。
假设我已经在框中(编辑),并且我按下 "Bold" 复选框,我希望能够继续编辑 - 在框中键入 - 但即使我尝试
- 设置焦点(将闪烁的文本光标放在框中),
- 设置光标的位置(我可以移动它,或者 select 东西...可行,但我想保持当前位置和 selection)
- 抓住键盘 - 似乎什么也没做
我似乎 return 没有任何内容,所以我继续输入(使用新字体设置)。
我怎样才能得到 QTextCursor
或其他任何东西来让我继续编辑文本?
格式更改后您需要关注 QGraphicsView
。你不能关注 QGraphicsTextItem
因为它不是 QWidget
.