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テキストを編集し続けることができるようにするにはどうすればよいですか?