QGraphicsTextItem
をユーザーフレンドリーなオブジェクトとして機能させるのに苦労しています。
編集可能な状態で移動するのは非常に難しいので、編集不可能として起動し、ダブルクリックで編集可能にします。次に、フォーカスを失ったときに編集をオフにします。
私の問題は、最初の編集でキャレットが表示されないことです。
私はマウスの位置に基づいて位置を取得しようとしました(別の問題を解決しようとしていたこの質問のように)、またはQGraphicsTextItem::mouseDoubleClickEvent(event);
何を試しても、キャレットは最初のアクションでは見えません-入力を開始するまで(またはフォーカスを外して元に戻すまで)-正しい場所にあります。
入力した後、または選択を解除して再選択した後、キャレットは毎回通常の場所に表示されます。
アイテム コンストラクターで QTextCursor を呼び出し、その位置を 0 に設定しようとしましたが、違いはありませんでした。
何が違いましたか:2つの状況の1つ(どちらもできません): a)コンストラクターで
アイテムを
開始b)移動/フォーカス/選択可能なフラグなしでアイテムを開始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();
}
テキストの編集も検討しました - それが機能するかどうかはわかりませんが、すぐに対処しなければならない元に戻すスタックに影響すると思います....
テキストアイテムの最初のダブルクリックアクションでキャレットを表示するにはどうすればよいですか?
(ユーザーとして、キャレットが表示されないと、入力できるかどうかわからなくなります...機能していても...アクションのフィードバックがなければ、オブジェクトに自信がありません。この問題。)