如何实现跨越小窗口状态QListWidget项目一致的高亮?(How do I achieve co

2019-08-06 21:15发布

我使用的PyQt 4.8.3创建一个对话框有两个QListWidgets都允许多个选择。

  1. 我觉得,如果这些QListWidgets被激活时,选择的项目以蓝色高亮显示,只有当QListWidget具有焦点,没有焦点的亮点是浅灰色。

  2. 我还发现,如果QListWidgets被禁用,选定的项目以蓝色尽管缺乏重点突出。

当用户从一个列表到另一个,他们会觉得这混乱。

作为一个开发者,我觉得浅灰色/消沉,蓝/禁止的行为不可取。 我将在修改欣赏他们的任何意见。

我已经通过了文档的看着QListWidget,而QListView和QAbstractView没有找到适用什么,我也通过看样式表文件,而无需任何运气。

Answer 1:

我想在这里使用样式表。 在这个例子中,在这个选定的项目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_())


Answer 2:

最简单的方法是改变QPalette (如果样式表不为你工作)。
只需设置调色板而QListView你想改变(只)值。

做这样的事情:

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

我建议阅读调色板财产是如何工作的(所以你需要设置只有你想改变的东西从父母和QApplication的合并值)。
您也可以通过改变调色板的QApplication改变全球这个颜色。



Answer 3:

QItemDelegate可以用来提供自定义显示特征。 我希望这会帮助你。 您可以重新实现

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


文章来源: How do I achieve consistent highlighting of QListWidget items across widget states?