Wie bekomme ich eine konsequente Hervorhebung von QListWidget-Elementen über Widget-Staaten?

Ich benutze PyQT 4.8.3, um einen Dialog mit zwei QListWidgets zu erstellen, die eine Mehrfachauswahl ermöglichen.

  1. Ich finde, dass, wenn diese QListWidgets aktiviert sind, die ausgewählten Elemente in blau markiert werden, nur wenn das QListWidget Fokus hat, ohne Fokus ist das Highlight hellgrau.

  2. Ich finde auch, dass wenn die QListWidgets deaktiviert sind, die ausgewählten Elemente trotz fehlender Fokus in blau hervorgehoben sind.

Bildbeschreibung hier eingeben

Als die Benutzer von einer Liste zum anderen gehen, finden sie das sehr verwirrend.

Als Entwickler finde ich das hellgraue / unfokussierte, blaue / behinderte Verhalten unerwünscht. Ich würde mich über jeden Rat informieren.

Ich habe die Docs für QListWidget, QListView und QAbstractView durchgesehen, ohne etwas anwendbar zu finden, ich habe auch die Stylesheet- Dokumentation ohne Glück gesehen.

3 Solutions collect form web for “Wie bekomme ich eine konsequente Hervorhebung von QListWidget-Elementen über Widget-Staaten?”

Ich würde hier Stylesheets verwenden. In diesem Beispiel werden die ausgewählten Elemente in diesem QListWidget in blau hervorgehoben, und wenn das QListWidget deaktiviert ist oder ohne Fokus werden sie grau werden:

 #!/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_()) 

Der einfachste Ansatz ist alter QPalette (wenn Stylesheet nicht für dich arbeitet).
Setzen Sie einfach die Palette für QListView mit Werten, die Sie ändern möchten (nur).

Mache so was:

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

Ich empfehle zu lesen, wie Palette-Eigenschaft funktioniert (es fügt Werte von Eltern und QApplication, so dass Sie brauchen nur die Dinge, die Sie ändern möchten).
Sie können diese Farben auch global ändern, indem Sie die Palette für QApplication ändern.

QItemDelegate kann verwendet werden, um benutzerdefinierte Anzeigefunktionen bereitzustellen. Ich hoffe es hilft dir. Sie können reimplementieren

 virtual void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const 
  • CodeEditor Beispiel in pyqt
  • PyQt4-Kraftansicht, um von QAbstractItemModel zu holen
  • Funktionsweise von internalPointer
  • PyQt-Thread läuft noch nach dem Schließen des Fensters
  • QGraphicsView Drag & Drop funktioniert nicht beim Ziehen des lokalen Bildes auf meine App
  • Wie groß sind wie? (Python) Projekte?
  • Eclipse externes Werkzeug für Qt .ui zu pyuic
  • PySide / Qt Importfehler
  • Wie man eine Widget-Höhe ein fester Anteil zu seiner Breite macht
  • Wie man QTableView letzte Spaltenüberschrift ausdehnt
  • Chained QSortFilterProxyModels
  • Python ist die beste Programmiersprache der Welt.