1

私はTextItem継承していQGraphicsTextItemます。ダブルクリックでテキストを編集でき、クリックアウトするとテキストが編集できなくなるようにしました。

void TextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event)
{
    setTextInteractionFlags(Qt::TextEditorInteraction);
    setFocus();

    int p = document()->documentLayout()->hitTest(event->pos(), Qt::FuzzyHit);
    QTextCursor _cursor = textCursor();
    _cursor.setPosition(p);
    setTextCursor(_cursor);
}

void TextItem::focusOutEvent(QFocusEvent *event)
{
    Q_UNUSED(event);
    setTextInteractionFlags(Qt::NoTextInteraction);
}

クリックアウトすると、テキストは編集できなくなりますが、キャレットは引き続き表示されます。

を追加setCursor(Qt::OpenHandCursor);するとfocusOutEvent(そして、設定するカーソルの形状を覚えようとしている可能性があります...まだ方法はわかりません)、これを修正します-キャレットが消えます-しかし、それは正しい修正だとは思いません。

QTextCursorそれでも、編集モードでなくなったときにキャレットを非表示にする方法が見つかりません-そして、設定がそれNoTextInteractionを行うべきだったようです...

編集モードでないときにキャレットを非表示にする最良の方法は何ですか?

4

2 に答える 2

1

あなたはキャレットについて話している - テキスト編集位置の画面上の表示。あなたの説明はQtのバグのようです。

このsetCursor呼び出しは、キャレットではなく、マウス ポインターを変更します。アイテムがキャレットの状態を相互作用フラグと同期するように強制する副作用があります。このような同期がないことが、発生するバグです。

クラスはキャレットを表すのQTextCursorではなく、テキスト ドキュメント内の位置を表します。これは派手なイテレータであり、目に見える表現から完全に切り離されています。

は、そのプロパティQGraphicsTextItemの位置を表すキャレットをたまたま維持しています。textCursor同じドキュメントで他のQTextCursorインスタンスを操作することができますが、それらにはキャレットが関連付けられていません。それらは単なる反復子です。

バグの 1 つの回避策はわかっていますが、次の方法setCursorも試してください。

  1. update()インタラクションが無効になった後のアイテムの。

  2. を null カーソルに設定しtextCursorます。おそらくupdate().

    setTextCursor(QTextCursor());
    
于 2015-08-27T21:14:08.000 に答える