問題タブ [qgraphicstextitem]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
194 参照

qt - QGraphicsTextItem の最初のダブルクリック アクションでキャレットを表示するにはどうすればよいですか?

QGraphicsTextItemをユーザーフレンドリーなオブジェクトとして機能させるのに苦労しています。
編集可能な状態で移動するのは非常に難しいので、編集不可能として起動し、ダブルクリックで編集可能にします。次に、フォーカスを失ったときに編集をオフにします。

私の問題は、最初の編集でキャレットが表示されないことです。
私はマウスの位置に基づいて位置を取得しようとしました(別の問題を解決しようとしていたこの質問のように)、またはQGraphicsTextItem::mouseDoubleClickEvent(event);

何を試しても、キャレットは最初のアクションでは見えません-入力を開始するまで(またはフォーカスを外して元に戻すまで)-正しい場所にあります。

入力した後、または選択を解除して再選択した後、キャレットは毎回通常の場所に表示されます。

アイテム コンストラクターで QTextCursor を呼び出し、その位置を 0 に設定しようとしましたが、違いはありませんでした。

何が違いましたか:2つの状況の1つ(どちらもできません): a)コンストラクターで
アイテムを 開始b)移動/フォーカス/選択可能なフラグなしでアイテムを開始Qt::TextEditorInteraction

どちらもできません-アイテムのデフォルトの状態は移動可能でなければならず、それがテキスト編集を妨げるためです(最初に説明したように)。
編集中にこれらのフラグを無効にしようとしましたが...効果はありません。

ここに問題を示す簡単なコードがあります。誰かがアイデアを持っていることを願っています。

mytextitem.h

mytextitem.cpp

main.cpp

テキストの編集も検討しました - それが機能するかどうかはわかりませんが、すぐに対処しなければならない元に戻すスタックに影響すると思います....

テキストアイテムの最初のダブルクリックアクションでキャレットを表示するにはどうすればよいですか?

(ユーザーとして、キャレットが表示されないと、入力できるかどうかわからなくなります...機能していても...アクションのフィードバックがなければ、オブジェクトに自信がありません。この問題。)

0 投票する
1 に答える
445 参照

qt - QGraphicsTextItemのフォーマット変更後にテキスト編集を続ける方法は?

QGraphicsTextItem編集可能なに変更 (フォントの変更) を加えようとしています。
テキストの断片の書式設定、または入力ポイントに適用される書式設定を変更しようとしています (テキストを太字に設定すると、そのアクションの後にカーソル位置で入力したテキストが太字になります)。

テキストフラグメントの書式設定は機能しますが、フォーカスをアイテムに正しく戻す方法が見つかりません。
キャレットを正しい位置に表示することはできますが、実際にボックスをクリックしない限り、ボックスに入力することはできません (できるはずだと思われますが)。

簡単なサンプル(何らかの理由でプログラムを閉じるとクラッシュしますが、メインプログラムではなくテキストクラスをテストしているので気にしません):

ヘッダー: mytextitem.h

mytextitem.cpp

main.cpp

ボックス内をクリックした場合のみ、項目を編集できます。

すでにボックス内 (編集中) にいて、[太字] チェックボックスを押したと仮定すると、編集を続行できると思います (ボックスに入力します)。

  • フォーカスを設定します (ボックス内に点滅するテキスト カーソルを配置します)。
  • カーソルの位置を設定します(移動したり、選択したりできます...動作しますが、現在の位置と選択を維持したい)
  • キーボードをつかむ - 何もしないようです

何もボックスに戻ってこないようなので、(新しいフォント設定で) 入力を続けます。

QTextCursorテキストを編集し続けることができるようにするにはどうすればよいですか?

0 投票する
1 に答える
1207 参照

qt - リッチ テキスト文字とブロック フォーマットの読み取り

を使用してリッチテキストアイテムを実装していますQGraphicsTextItem

フォント サイズを設定するには、たとえば次のようにします。

はるかに複雑なのは、フォント サイズを読み取ることです。
選択があると仮定すると、ドキュメントを繰り返し処理し、すべてQTextBlockの ,QTextFragmentを読んでQTextCharFormat...
しかし、単純なオプションは、選択がない場合は、カーソルのフォントサイズを読み取るだけです:

これは機能しますが、3 つの問題が見つかりました。

QGraphicsTextItem1)プロパティによるフォントサイズの設定:

getこれは、上記の関数によって 0 を返します。項目全体のフォント サイズを設定するには、関数と同じ方法を使用する必要がありsetます。メソッドは、から読み取ることができるフォントを設定する
べきではありませんか?setFontQTextCursor

2)setHtmlフォーマットを設定できますが、そのフォーマットを読み取る方法がわかりません
。html フラグメントからリッチ テキストのフォーマットを読み取るにはどうすればよいですか? html を解析する唯一の可能性はありますか?

3)(私の現在のつまずき)
外部ソースからフォーマットされたテキストをコピーして貼り付けるとQGraphicsTextItem、ソースのフォーマットが維持されているように見えますが、そのフォーマットをどのように読むことができますか?
上記のgetメソッドは、テキストが外部から貼り付けられた場合、フォント サイズ 0 を読み取ります。
font().pointSize()常に 8 を返します (設定していないので、デフォルトだと思います)
テキスト形式を読み取る別の方法はありますか?
クリップボードのテキストは html を使用してフォーマットされていますか?

貼り付けたテキストからフォント サイズ (またはその他の書式設定) を見つけるにはどうすればよいですか?

(配置などのブロックの書式設定にも同じ質問が適用されます)。

0 投票する
1 に答える
1446 参照

qt - QGraphicsTextItem で選択したテキストを削除/削除/置換します

内の選択したテキストを削除したいと思いますQGraphicsTextItem

私はそれが使用するすべてのクラスを検索してきました-のようQTextCursorに... すべてを削除する の関数をQTextDocument除いて、テキストを削除するものは何も見つかりません...clear()QTextDocument

選択を解除するにはどうすればよいですか?

または (カスタムの貼り付けコマンドにこれが必要なため)、選択範囲を既存のテキストまたは html に置き換えるにはどうすればよいですか?

0 投票する
2 に答える
608 参照

qt - 空行のフォーマットを取得する

私はどのようにQTextBlock::iterator動作するかについて少し混乱しています:

ドキュメントには、通常のテキストでの使用方法の明確な例が示されています。

テキストの空白行で問題が発生します。それらの行で、

フォーマット (char および block) を読み取ることができる必要があります。

最後にブロックをチェックする必要がありますか? 新しい行以外にブロックをテストする他の方法はありますか?

私の現在の解決策:「for」ループとは別に、最後のイテレータもチェックし、それがドキュメントの最後のブロックかどうかもテストします(ドキュメントの最後のブロックのフラグメントを取得しようとすると、プログラムがクラッシュします)。

私はドキュメントに反対しているようです...空の行のフォーマットを取得するにはどうすればよいですか?

編集:

私の古い解決策:

Tarod からの回答に基づく新しいソリューションでは、1 つのテストが省略されます (ただし、動作の一貫性が低いようです)。

最後のブロックをチェックし、空の場合は使用しないようにする必要があります。クラッシュすることがあります。

0 投票する
1 に答える
1012 参照

qt - QGraphicPixmapItem のダブルクリック イベントは、QGraphicsTextItem の送信中に親ウィジェットに移動しません

Qt にメイン ウィジェットがあり、このウィジェットにはQGraphicsViewandが含まれていQGraphicsSceneます。QGraphicsPixmapItemシーンでs とsを追加しQGraphicsTextItemます。私が扱うメインウィジェットではQWidget::mouseDoubleClickEvent ( QMouseEvent * event )、私のアイテムはすべてフラグが設定されています:

シーン内のアイテムを移動して選択したいので、ダブルクリックが発生したときにメインウィジェットがそれを処理したいからです。ダブルクリックするとメインウィジェットにQGraphicsTextItem入りますが、アイテムをダブルクリックすると、ダブルクリックを吸収してメインウィジェットに送信しません。また、フラグが設定されていない場合は、ダブルクリック イベントも吸収します。なぜそれが発生するのですか?s のサブクラスを実装したくなく、既に定義されているメソッドを使用したかったのです。これが私がしていることの写真です:mouseDoubleClickEventQGraphicsPixmapItemIsFocusableQGraphicsTextItem
QGraphicsItem

ここに画像の説明を入力

0 投票する
1 に答える
4386 参照

qt - 正確な高さと幅の QGraphicsTextItem テキスト コンテンツを設定する

テキスト コンテンツの正確な幅と高さでテキスト アイテムを作成する必要があります。
テキストの高さは最も重要な要件です。
テキストの位置は、テキスト自体に対して相対的でなければなりません。

また、キャンバス上の正確な場所に配置できる必要があります。

(印刷可能な)キャンバス(より大きなQGraphicsScene)、たとえば幅5インチ、高さ1インチと仮定すると、テキストは上下左右に引き伸ばされ、部分的にではなくキャンバスに配置されるはずです。


QGraphicsTextItemアイテム タイプのサブクラス化を行っています。を使用してQTransform()、必要なサイズ (インチ、mm、またはピクセル (72 * インチ)) にサイズ変更しています。
また、document()マージンを 0 に設定し、内部 (QTextBlockFormatマージンなど) もすべて 0 に設定します。

setItemSize(QSizeF sz)必要に応じてサイズを変更する(ピクセル単位のsz)を実装しましたQGraphicsTextItem
sz はアイテムのバウンディング rect を使用して初期化されます。
折り返されていないと仮定すると、1 行のテキスト (この問題が解決されれば、複数行のテキストは個別に解決される可能性があります)。

項目をキャンバスに追加すると、まだ上下の余白が表示されますが、これはフォントの選択によって異なります。
アイテムを表示するために、アイテムの周りに四角形を描きました。
上/下の距離は、フォントの選択によって異なります。


これらの距離を決定するためにフォント メトリックを使用しようとしましpaint()た (テキストが収まる位置と四角形を決定するために線を引いています)。

少なくとも、大文字、アクセントまたは特殊文字のフォントに使用する正しいサイズを決定できれば幸いです(もちろん、任意の文字を使用できる必要がありますが、それは出発点です)。しかし、最も単純なケースであっても、テキストコンテンツのサイズと位置(アイテムの (0,0) に相対的)
を決定する少なくとも何らかの方法.....

フォント メトリックtightBoundingRect()はサイズに関して最も正確に見えますが、その位置を特定することは不可能であるため、どうにかしてアイテムを正しく作成し、キャンバスに収まるように正しくサイズ変更/シフトすることができます。


アイテムの (0,0) に対するテキストの少なくとも正確なサイズと位置を決定するのに苦労した例をいくつか示します (これを行うと、その情報を外部に公開するか、シフトを含めることができると仮定します)。サイズ変更時にアイテムが変換されます)。
フォント メトリックによってアドバタイズされるテキストのサイズが常にテキストをカバーするとは限らないことに注意してください。また、フォントが異なると、テキスト自体の周りにタイトな境界四角形 (マゼンタ) を配置することができません。(複数の推測を行いました。以下のコードは 1 つにすぎません。行はさまざまなフォント メトリック サイズを表示しようとしています)。

ここに画像の説明を入力

上記は、テキストアイテム継承のペイント機能の実験でしたQGraphicsTextItem:

QGraphicsTextItemを使用せずに、長方形の内側にテキストをペイントすることも試しました。同じことが起こります。

(Qt 4.7 - 5.x)

0 投票する
1 に答える
155 参照

c++ - QMap を使用してオブジェクトを保存すると、アプリケーションが応答を停止する

私の友人と私は、Qt を使用して C++ でゲームを作ろうとしています。実行時にそれらにアクセスするためにQGraphicsTextItem、いくつかを に保存したいと考えています。QMapコードの関連部分をここに貼り付けましたが、問題はプログラムが応答を停止することです。

ゲーム.cpp

GameInfo.h

私たちは誰も C++ や Qt を使った経験がありませんが、助けていただければ幸いです。