2017-01-06 11 views
3

QtableView 및 QListView를 사용하는 Qt 응용 프로그램이 있습니다. 두 위젯 모두에서 일부 아이콘을 표시합니다.QListView에서 아이콘 위에 선택 영역을 알파 블렌딩하는 것을 방지하려면 어떻게해야합니까?

사용자가 항목 중 하나를 선택하면 아이콘 위에 선택 항목이 혼합되어 아이콘의 콘트라스트가 약간 떨어지고 약간 다른 색상으로 표시됩니다.

Qt가 선택을 먼저 그린 다음 맨 위에 아이콘을 그리면 선택 여부에 관계없이 똑같이 보입니다. 어떻게해야합니까?

업데이트 :

이처럼 내 문제가 모습입니다 :

Effect with a white rectangle icon

: 그것은 흰색 사각형 아이콘으로 자리 쉽게는

Effect with a normal 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과 같은 방식으로 아이콘을 그릴 수 있습니다.