Установить цвет текста в QListWidget после проверки более чем количества параметров - PullRequest
0 голосов
/ 05 октября 2018

Я создал QListWidget, который заполнен флажками, и я хотел закодировать его таким образом, чтобы, если проверено более 3 элементов в списке, «четвертый» элемент, который должен быть проверен, текстцвет будет окрашен в красный цвет.

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

Это мой код:

class PromptDialog(QtGui.QDialog):
    def __init__(self, items_list, parent=None):
        super(PromptDialog, self).__init__(parent)
        self.setWindowTitle("My Test Dialog")
        self.init_ui(items_list)
        self.init_connections()

    def init_ui(self, items_list):
        self.listWidget = QtGui.QListWidget()
        for item in items_list:
            list_widget_item = QtGui.QListWidgetItem(item)
            # could be Qt.Unchecked; setting it makes the check appear
            list_widget_item.setCheckState(QtCore.Qt.Unchecked)
            self.listWidget.addItem(list_widget_item)

        get_sels_btn = QtGui.QPushButton("Save Selections")

        cancel_btn = QtGui.QPushButton("Cancel")
        cancel_btn.clicked.connect(self.close)

        hbox_layout = QtGui.QHBoxLayout()
        hbox_layout.addWidget(self.listWidget, 1)

        btns_layout = QtGui.QHBoxLayout()
        btns_layout.addStretch(1)
        btns_layout.addWidget(get_sels_btn)
        btns_layout.addWidget(cancel_btn)

        vbox_layout = QtGui.QVBoxLayout()
        vbox_layout.addLayout(hbox_layout)
        vbox_layout.addSpacing(12)
        vbox_layout.addLayout(btns_layout)

        self.setLayout(vbox_layout)

    def init_connections(self):
        self.listWidget.clicked.connect(self.derived_checked_opts)

    def derived_checked_opts(self):
        checked_items = []
        for index in range(self.listWidget.count()):
            if self.listWidget.item(index).checkState() == QtCore.Qt.Checked:
                checked_items.append(self.listWidget.item(index))

            if len(checked_items) > 3:
                self.listWidget.setStyleSheet("color: red")
            else:
                self.listWidget.setStyleSheet("color: none")


some_items = ['item01', 'item02', 'item03', 'item04', 'item05', 'item06']
my_dialog = PromptDialog(some_items)
my_dialog.show()

Пример того, что я ожидаю:

  1. Если любой из 3опции (3 или меньше) проверяются, текст остается белым

[x] item01
[x] item02
[x] item03
[] item04
[] item05
[] item06
Теперь я собираюсь проверить один или несколько вариантов (четвертый элемент и более)
[x] item01 --> Text remains white
[x] item02 --> Text remains white
[x] item03 --> Text remains white
[x] item04 --> Text will turns red
[] item05
[] item06

В настоящее время у меня возникают проблемы с делом № 2, весь текстстановится красным:

[x] item01 --> Text turns red
[x] item02 --> Text turns red
[x] item03 --> Text turns red
[x] item04 --> Text turns red
[] item05 --> Text turns red
[] item06 --> Text turns red
...