問題タブ [qstyleditemdelegate]

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 に答える
755 参照

c++ - 値が更新されたら、QTableviewセルの色を時間内にアニメーション化する方法は?

接続されたデータ モデルを介して値が更新されたら、QTableview セルの色を (時間内に) アニメーション化し、何かが変更されたというエンド ユーザーの注意を引きたいと考えています。

fi blue のグラデーションで色が変化し、値の変更直後に青から始まり、約 1 ~ 2 秒で白にフェードアウトするという考え方です。

モデル ビューの概念 ( http://doc.qt.io/qt-5/model-view-programming.html )を使用しているため、ここでは QStyledItemDelegate を使用する必要があると思います。

アニメーションを開始するには、セルの値変更のトリガーが必要です。これは、値の変更で呼び出される paint() メソッドを介して実現できます。paint() に渡された index パラメータから行と列を割り出し、どのセルをアニメートするかを把握できます。

これまでのところ、そのセルの色を青に設定できます。ここで問題が発生します。色は時間ステップで白に向かってフェードします。だから私は QStyledItemDelegate クラスの QTimer について考えていて、アニメーション化されているセルのちょっとした簿記を維持していました (青のグラデーションの色を計算するために使用されるカウントダウン値の単純なリストである可能性があります.値が低いほど、グラデーションは白に向かい、0 になるとセルのデフォルトの色である白になります。各 QTimer timeout() イベントでは、0 以外の値はすべて 1 ずつ引き下げられます。QStyledItemDelegate は、その QTableview の行にのみ接続されます。値アイテムが表示される場所、つまりカラーアニメーションを作成したい。

私が直面している問題は次のとおりです。

  1. paint() は const メソッドであるため、クラス パラメータを変更することはできません。
  2. QTimer イベントでセルの色を再描画する方法 (QTableview 全体を再描画するのは神スタイルではありません)

私はそれを機能させることができましたが、それは汚い解決策だと思います。私がしたことは、データ モデルの各セルのカラー アニメーションの簿記を維持することでした。カラーアニメーションは視覚的な側面にすぎないため、データモデルに存在するべきではないため、これは汚いソリューションだと思います。このように、それは移植可能なソリューションでもありません。つまり、別のプロジェクトでは、それを機能させるために多くの作業をやり直す必要があります。

私は自分のアプリケーションを本質的な問題に落とし込みました。完全なコードはここにあります (動作中のアプリケーション): https://github.com/fruitCoder123/animated_tableview_cell

私は素晴らしい解決策を見つけるために恐ろしい時間を費やしました. 1か月前にQtを始めたので、知識が不足している可能性があります。うまくいけば、誰かがそれをうまく解決する方法のヒントを与えることができます-ビューにカプセル化され、データモデルに絡まることはありません.

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

c++ - 複数の色でテキストを描画するためのカスタム QStyledItemDelegate

QTableWidget2 つの文字列の違いを示す内に 2 つの列を表示したいと考えています(以前はいくつかのレーベンシュタイン距離アルゴリズムによって計算されていました)。パーツは、各 のデータ内に として格納されQTableWidgetItemますQStringList。最初の部分を黒で表示し、次の部分を赤で表示し、次に黒、赤などと交互に表示する必要があります。

この目的のために、最終的にメソッドを呼び出すQStyledItemDelegateカスタム関数を実装しました。paint()drawText()

これにより、列の幅が十分である限り、正しい描画が行われます。

列の幅は十分

しかし、列が小さくなるとすぐに、乱雑なオーバーフローが発生します:

列が狭すぎる

opt.rectこれは、テキスト全体ではなく、ディスプレイの各部分に適用されていることが原因であることは間違いありません。

唯一の問題は、これを修正する方法がわからないことです;-)どんな助けも大歓迎です! 前もって感謝します!

0 投票する
0 に答える
38 参照

qt - ボタンを使用してアイテム デリゲートを作成するにはどうすればよいですか?

ここに画像の説明を入力

3 列のリスト。1 列目は表示/非表示、2 列目はモデル名、3 列目はアイテムをクリックしたときにのみ表示されるロック/ロック解除です。

QTableWidget と QStyledItemDelegate を使用して、このようなものをどのように作成しますか? ドキュメントといくつかの質問を見てきましたが、まだ理解するのが難しいと感じています。