QtでQTableViewのセルに上下のボタンが押された状態を持たせる最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/970618

質問

の細胞を作ろうとしています 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.backgroundBrush は正しいです sizeHint メソッドですが、 paint 方法 。今ならその理由がわかります sizeHint 背景ブラシと paint 方法ではありません。ノキアに報告してみます。

編集:

私は正しかったようですが、これは Qt4.5 未満のバグです。
QStyleOptionViewItemV4はアイコンとbackgroundBrushをコピーしません

テーブルセルの行のID/行数を取得して、それを使用しているカラーテーブルと照合して、それに応じて色を設定することはできませんか?あなたの質問をよく理解できたかどうかわかりません。

背景色のデータ ロールを割り当て、アイテム デリゲートで、背景色が何であるかをモデル インデックスに問い合わせます (使用して data( bg_color_role ) または同様のもの)。次に、モデル内で、データ関数が色を返すことを確認する必要があります。 bg_color_role それはモデル化されるデータに適しています。

その方法は、ペイント メソッドで取得した QModelIndex オブジェクトのデータ メソッドを使用し、特定のロールを要求することです (カスタム モデルを定義する場合は、独自のロールを追加し、必要な情報を提供できます)。それらの役割の代理人。)

TimW さん、前に initStyleOption を呼び出して QStyleOptionViewItemV4 情報を入力する必要があると思います。

背景画像の要件がどこから来たのかわかりません。セルを次のように見せたい場合は、 QPushButtons、おそらくから継承する必要があります 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 ボタン画像を描画することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top