Как добиться последовательного выделения элементов QListWidget в состояниях виджета?

Я использую PyQT 4.8.3 для создания диалога с двумя QListWidgets, позволяющими множественный выбор.

  1. Я считаю, что если эти QListWidgets включены, выбранные элементы выделяются синим цветом только тогда, когда QListWidget имеет фокус, без фокуса подсветка светло-серая.

  2. Я также считаю, что если QListWidgets отключены, некоторые элементы выделены синим цветом, несмотря на отсутствие фокусировать.

enter image description here

Как пользователи переходят из одного списка в другой они найдут это очень путаешь.

как разработчик я считаю, что светло-серый / расфокусированный, синий / отключенное поведение нежелательно. Я бы признателен за любые советы по их модификации.

Я просмотрел документы для QListWidget, QListView и QAbstractView не найдя ничего применимого, я также просмотрел таблицы стилей документация без везения.

3 ответов


Я бы использовал таблицы стилей здесь. В этом примере выбранные элементы в this QListWidget он будет выделен синим цветом, а когда QListWidget отключен или без фокуса они станут серыми:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtCore, QtGui

class myWindow(QtGui.QWidget):

    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)

        self.setStyleSheet( """ QListWidget:item:selected:active {
                                     background: blue;
                                }
                                QListWidget:item:selected:!active {
                                     background: gray;
                                }
                                QListWidget:item:selected:disabled {
                                     background: gray;
                                }
                                QListWidget:item:selected:!disabled {
                                     background: blue;
                                }
                                """
                                )

        self.listWidget = QtGui.QListWidget(self)
        self.listWidget.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)

        self.button = QtGui.QPushButton(self)
        self.button.setText("Disable the list!")
        self.button.clicked.connect(self.on_button_clicked)

        self.layout = QtGui.QVBoxLayout(self)
        self.layout.addWidget(self.button)
        self.layout.addWidget(self.listWidget)

        for itemNumber in range(5):
            item = QtGui.QListWidgetItem(self.listWidget)
            item.setText("Item {0}".format(itemNumber))
            self.listWidget.addItem(item)


    @QtCore.pyqtSlot()
    def on_button_clicked(self):
        enable = False if self.listWidget.isEnabled() else True

        self.listWidget.setEnabled(enable)

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myWindow')

    main = myWindow()
    main.show()

    sys.exit(app.exec_())

самый простой подход-alter QPalette (если таблица стилей не работает для вас).
Просто установите палитру для QListView со значениями, которые вы хотите изменить (только).

сделать что-то вроде этого:

QPalette customPalette;
QPalette orginalPallete = listView->palette();
customPalette->setBrush(QPalette::Disabled, QPalette::Highlight,
                        orginalPallete.brush(QPalette::Active, QPalette::Highlight));
listView->setPalette(customPalette);

Я рекомендую прочитать, как работает свойство palette (оно объединяет значения от родителей и QApplication, поэтому вам нужно установить только то, что вы хотите изменить).
Вы также можете изменить эти цвета глобально, изменив палитру для QApplication.


QItemDelegate может использоваться для предоставления пользовательских функций отображения. Надеюсь, это вам поможет. Вы можете переопределить

virtual void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const