2017-02-08 2 views
0

データを表示するQTreeViewがあり、色の進捗バーを表示するためにカスタムのデリゲートを列の1つにインストールしました。私はoption.paletteが提供する色情報を使用して、デフォルトのデリゲートの動作をエミュレートすることができました:QTreeViewカスタムアイテムの表示デリゲートとCSS

class ProgressBarDelegate : public QStyledItemDelegate 
{ 
public: 
    ProgressBarDelegate(QObject *parent = 0) {} 
    ~ProgressBarDelegate() {} 
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
    { 
     // QStyledItemDelegate::paint(painter, option, index); // default implementation 

     painter->save(); 

     // progressbar construction and drawing 

     painter->restore(); 
    } 
}; 

さて、私はマウスのホバーイベントに行を強調表示します。

ui->treeView->setStyleSheet("QTreeView::item:hover{background-color:#D0E0F0;}"); 

作品を強調ホバーを、しかし、予想通り、私のカスタムデリゲートの実装では、CSSの設定を無視します:私は、ツリービューにカスタムCSSを設定

Without defaulte delegate

(DARKBLUE線が選択されます項目、lightblue-ish行は、CSSのホバーで強調表示された行です)

デフォルトの実装を有効にすると、CSS設定が代理人に影響しますが、画像がぼやけます:

With default delegate

質問です:

  • は、デリゲートをwithingからデータを設定オーバーライドCSSを知る方法はありますか? option.paletteにこの情報が含まれていないようです。

Iはdescried hereとしてQTreeViewプロパティを読み取る試みた:

qDebug() << treeView()->property("background"); 

をしかし、コンソールがQVariant(Invalid)

を示すIも使用さdrawControl()drawPrimitive()方法、のためのQtソースコードを読み取る試みデフォルトのデリゲートの実装では、私はウィジェットパレット参照のみを検索し、CSSオーバーライドへの接続は見つけられませんでした。

答えて

0

sourceを読んだ後、私はあることを発見CSSの解析と計算は、アプリケーションが直接アクセスできないプライベートQStyleSheetStyleオブジェクトによって処理されているため、デリゲート内からCSSデータにアクセスする方法はありません。このオブジェクトは、描画ルーチンで使用されるそれぞれのoption.paletteフィールドを単に変更します。

ただし、手動でスタイルのdrawPrimitive()メソッドを呼び出すことによってoption.paletteフィールドを解析することなく、所望の設定で、要素のいくつかを描画するデリゲートを強制する方法があります:

// drawing background with desired colors: 
option.widget->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter); 

この方法では、との背景を描画しますそれぞれの設定:

somewhat acceptable

私は強制的に類似した方法があるはずだと思うCSS-設定の変更の行で、何かを使用する:

option.widget->style()->proxy()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter); 

しかし、Qtのスタイルのフレームワークの内部の仕組みの理解の欠如に、私はまだそれを見つけることができませんでした。

0

あなたはpaint方法でコンポーネントを描画しているとして、あなたは「ホバー」効果を引き出すことができ

あなたはこのようなものを使用することができます

// detect the hover 
QStyleOptionViewItemV4 styleOption(option); 
bool mouseOver = (styleOption.state & QStyle::State_MouseOver); 
// draw if hovered  
if(mouseOver) { 
... 
} 
+0

ええ、実際に必要な状態のすべてを手動で検出する必要はないと本当に望んでいました。私は結局あなたのソリューションを実装しなければならないと思う。 – Kef

関連する問題