QtでQTableViewのセルに上下のボタンが押された状態を持たせる最良の方法は何ですか?
-
13-09-2019 - |
質問
の細胞を作ろうとしています QTableView
3D のクリック可能なボタンのように見えます。セルをクリックすると、ボタンが押されたように見えます。 誰もが、私が単に色を変更したいだけで、通常のボタンと押されたボタンの画像を 3 次元的に表示する必要があると考えているようです。
私はすでにこれを呼び出して実行しました QTableView::setItemDelegate()
, 、適切な ItemDelegate
クリックするとセルの背景が変わります。ただし、一部のセルを、含まれるデータに基づいて異なる色のボタンにしたいので、この時点で行き詰まっています。したがって、小さい番号のセルは赤いボタンになり、クリックするとボタンも赤くなり、他のセルは異なる色になります。
ボタンの色を設定できます TableModel
, ただし、ボタンをクリックすると、 ItemDelegate
それは他のものとは異なる色であるはずであることを知るためです。どうすればこの 2 つを結び付けることができますか? ItemDelegate
それが何色であるべきか知っていますか?
また、セルをボタンのように見せるもっと良い方法はあるのでしょうか?
解決
電話をかけることができます QModelIndex::model()
の中から ItemDelegate
さんの paint()
メソッドがあるため、 QModelIndex
パラメータ。これにより、 TableModel
データの場合は、セルのボタンの色をプログラムで決定できます。
ただし、これはまだ私が期待するほどエレガントではありません。上ボタンと下ボタンの両方を押した状態で表のセルの外観を変更するより良い方法を知っている人はいますか?
他のヒント
インデックスに背景色を聞いてみてはいかがでしょうか。
このようなもの ...
QStyleOptionToolButton buttonOption;
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option);
//...
buttonOption.palette.setBrush( QPalette::Button, index.data( Qt::BackgroundColorRole ) );
//...
Qt のバグのような気がしますが、きっとそうなっていたはずです...
// model code
if(role==Qt::BackgroundColorRole )
return qvariant_cast<QBrush>( QBrush(Qt::red) );
// delegate code
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );
なぜなら optionV4.backgroundBrus
h は正しいです sizeHint
メソッドですが、 paint
方法 。今ならその理由がわかります sizeHint
背景ブラシと paint
方法ではありません。ノキアに報告してみます。
編集:
私は正しかったようですが、これは Qt4.5 未満のバグです。
QStyleOptionViewItemV4はアイコンとbackgroundBrushをコピーしません
テーブルセルの行のID/行数を取得して、それを使用しているカラーテーブルと照合して、それに応じて色を設定することはできませんか?あなたの質問をよく理解できたかどうかわかりません。
背景色のデータ ロールを割り当て、アイテム デリゲートで、背景色が何であるかをモデル インデックスに問い合わせます (使用して data( bg_color_role )
または同様のもの)。次に、モデル内で、データ関数が色を返すことを確認する必要があります。 bg_color_role
それはモデル化されるデータに適しています。
その方法は、ペイント メソッドで取得した QModelIndex オブジェクトのデータ メソッドを使用し、特定のロールを要求することです (カスタム モデルを定義する場合は、独自のロールを追加し、必要な情報を提供できます)。それらの役割の代理人。)
TimW さん、前に initStyleOption を呼び出して QStyleOptionViewItemV4 情報を入力する必要があると思います。
背景画像の要件がどこから来たのかわかりません。セルを次のように見せたい場合は、 QPushButton
s、おそらくから継承する必要があります QItemDelegate
そして実装する paint()
使用する QStyle
あなたに絵を描くために QPushButton
, 、 このようなもの:
QStyleOptionButton opt;
// fill 'opt' from the information from the model, and the style option that's passed in
style()->drawControl( QStyle::CE_PushButton, &opt, painter );
カスタム スタイル シートを使用してみましたか?
すべてのセルに同じスタイルシートを適用し、選択されているかどうかに応じて背景画像/スタイルを変更して 3D ボタン画像を描画することができます。