8

我正在使用 PyQT 4.8.3 创建一个包含两个 QListWidgets 的对话框,它们都允许多选。

  1. 我发现如果启用了这些 QListWidgets,则仅当 QListWidget 具有焦点时,所选项目才会以蓝色突出显示,而没有焦点则突出显示为浅灰色。

  2. 我还发现,如果 QListWidgets 被禁用,尽管缺乏焦点,所选项目仍以蓝色突出显示。

在此处输入图像描述

当用户从一个列表转到另一个列表时,他们会发现这非常令人困惑。

作为一名开发人员,我发现浅灰色/无焦点、蓝色/禁用行为是不可取的。我将不胜感激有关修改它们的任何建议。

我浏览了QListWidget、QListView 和 QAbstractView的文档,但没有找到任何适用的东西,我也浏览了样式表文档,但没有任何运气。

4

3 回答 3

10

我会在这里使用样式表。在此示例中,其中的选定项目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_())
于 2013-01-15T08:13:59.260 回答
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 的调色板来全局更改此颜色。

于 2013-01-15T11:07:47.917 回答
1

QItemDelegate可用于提供自定义显示功能。我希望它会帮助你。你可以重新实现

virtual void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
于 2013-01-15T05:23:35.573 回答