2017-01-06 10 views
3

私はQTableViewとQListViewを使用するQtアプリケーションを持っています。両方のウィジェットで私はいくつかのアイコンを表示します。QListViewのアイコンの上に選択範囲をアルファブレンドしないようにするにはどうすればいいですか?

ユーザが項目の1つを選択すると、Qtアルファがアイコンの上に選択項目をブレンドして、アイコンのコントラストが低く、わずかに異なる色で表示されるという問題があります。

最初に選択を描画してから、アイコンを上に描画して、選択されているかどうかにかかわらず同じように見せます。どうやってやるの?

更新:

Effect with a normal icon

白い長方形のアイコンを見つけることが容易である:

Effect with a white rectangle icon

これは私の問題は、次のようになりますあなたはあなたが見るグラフィックスエディタで色の値をチェックする色の値が変化する。このオーバーレイなしでQtにアイコンをペイントして欲しいです。

QListViewは、色のグラデーションの背景にスタイルが設定されています。しかし私はunstyled QTableViewと同じ問題があります。

ところで、すべてのアイコンはSVGです。

答えて

2

ItemView要素の描画は、デリゲートによって処理されます。列、行、または個々の項目のカスタムデリゲートを設定できます。ウィジェットのスタイルに描画するデフォルトの実装は単に代表者:

void QStyledItemDelegate::paint(QPainter *painter, 
    const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    Q_ASSERT(index.isValid()); 

    QStyleOptionViewItem opt = option; 
    initStyleOption(&opt, index); 

    const QWidget *widget = QStyledItemDelegatePrivate::widget(option); 
    QStyle *style = widget ? widget->style() : QApplication::style(); 
    style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget); 
} 

あなたが描画hereを行い、実際のコードを見つけることができます。 Qt5に付属するすべてのスタイルは、最終的にItemView要素の描画をそのコードに委譲しているようです。興味深いのは、問題のコードが実際に選択範囲の上にアイコンを描画するため、カスタムスタイルを使用する必要があるということです。選択を呼び出す呼び出しは、次のとおりです。

proxy()->drawPrimitive(PE_PanelItemViewItem, opt, p, widget); 

他のすべての描画呼び出しの前に呼び出しが行われます。

カスタムデリゲートでは、QStyleOptionViewItem opt(最初のコードスニペットを参照)を変更することで、アイコン以外のすべての描画をスタイルに依頼することができます。その後、手動でアイコンを描画することができます。同じ方法でQCommonStyleを実行します。

関連する問題