我正在使用PyQT 4.8.3创建一个包含两个QListWidgets的对话框,允许多个选择。
我发现如果启用了这些QListWidgets,只有当QListWidget具有焦点时,所选项目才会以蓝色突出显示,而没有焦点,高亮显示为浅灰色。
我还发现如果禁用QListWidgets,尽管没有焦点,所选项目仍以蓝色突出显示。
当用户从一个列表转到另一个列表时,他们会发现此非常令人困惑。
作为开发人员,我发现浅灰色/不聚焦,蓝色/禁用行为是不受欢迎的。我很感激任何有关修改它们的建议。
我查看了QListWidget, QListView and QAbstractView的文档但未发现任何适用的内容,我也查看了stylesheet文档而没有任何运气。
答案 0 :(得分:9)
我会在这里使用样式表。在此示例中,此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_())
答案 1 :(得分: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的调色板来全局更改此颜色。
答案 2 :(得分:1)
QItemDelegate可用于提供自定义显示功能。我希望它会对你有所帮助。你可以重新实现
virtual void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const