Hallo,
ich bin gerade dabei, mit meinen Python-Skripten von Windows 10 auf Windows 11 umzuziehen (neuer Rechner). Und da gibt's jetzt eine unerwartete Sorte von Ärger, mit der ich mich ganz schlecht auskenne.
Es geht um GUI-Anwendungen, geschrieben mit PyQt, die ich selbst benutze, normalerweise ohne Stylesheets, ohne Änderungen an der Palette. Hat immer vernünftige Ergebnisse gegeben, bis jetzt:
In QListView- und QTableView-Komponenten erscheint die jeweils ausgewählte Zeile mit schwarzer Schrift und dunkelgrauem Hintergrund. Und beim Versuch, einen solchen Eintrag zu verändern, wurde der Inhalt des entsprechenden Feldes vorübergehend ganz unleserlich. Was sich da eigentlich abgespielt hat, konnte ich nicht einmal erkennen. Die entsprechenden Anwendungen sind vom alten Rechner (Windows 10) auf den neuen herüberkopiert, nicht verändert, die Python-Versionen sind gleich (3.13.7), die PyQt6-Versionen müssten auch übereinstimmen.
Ich würde dieses Übel natürlich gern an der Wurzel packen, d.h. am besten eine Einstellung kennen lernen, die den früheren Zustand (schwarzer Text auf weißem Grund, wenn man nicht eingreift) möglichst flächendeckend wiederherstellt. Ich habe versucht, in der PyQt- und Qt-Dokumentation die entscheidende Stelle zu finden, aber bisher vergeblich. Im übrigen scheint mir das, was ich jetzt sehe, fehlerhaft zu sein und keine reine Geschmacksfrage.
Kennt vielleicht jemand schon das Problem?
PyQt6, QListView und andere: Anzeige-Farben unter Windows 11 unbrauchbar
Einen Schritt weiter bin ich inzwischen: der Effekt war eine Folge der Windows-Einstellungen auf dem neuen Rechner. Bei der Personalisierung habe ich jetzt die "Akzentfarbe" auf "Manuell" gestellt, etwas Passendes ausgesucht und das war es. Wirkt allerdings auch in mindestens einem Programm (Thunderbird), dessen Einstellungen auch vorher unauffällig waren. Und deshalb bin ich nicht wirklich sicher, ob das der optimale Eingriffspunkt war.
Ich hänge deshalb doch noch ein Beispiel an - es hat allerdings für diesen Zweck den Nachteil, dass es aus Python-Skript und .ui-Datei besteht. Außerdem enthält es ein bisschen mehr als unbedingt nötig - ich wollte mit Stylesheets experimentieren, aber gerade die Farben ausgewählter Zeilen sollten davon nicht betroffen sein.
Dazu die .ui-Datei:
Ich hänge deshalb doch noch ein Beispiel an - es hat allerdings für diesen Zweck den Nachteil, dass es aus Python-Skript und .ui-Datei besteht. Außerdem enthält es ein bisschen mehr als unbedingt nötig - ich wollte mit Stylesheets experimentieren, aber gerade die Farben ausgewählter Zeilen sollten davon nicht betroffen sein.
Code: Alles auswählen
# test_stylesheet.py
import sys
import logging
from PyQt6 import QtCore
from PyQt6 import QtGui
from PyQt6 import QtWidgets
from PyQt6 import uic
modlog = logging.getLogger(__name__)
TESTDATA = [("Helen", "Borrie"), ("Kathrin", "Passig")]
class TestModel(QtGui.QStandardItemModel):
def __init__(self, data):
super().__init__(0, 3)
self.setHorizontalHeaderLabels(["Name", "Vorname", "Nachname"])
self.populate(data)
def appendRow(self, rowdata):
(vorname, nachname) = rowdata
name = f"{vorname} {nachname}"
super().appendRow([QtGui.QStandardItem(name),
QtGui.QStandardItem(vorname),
QtGui.QStandardItem(nachname)])
def populate(self, data):
for rowdata in data:
self.appendRow(rowdata)
def export(self):
newdata = []
for row in range(self.rowCount()):
rec = []
for col in range(self.columnCount()):
fieldval = self.data(self.index(row, col))
rec.append(fieldval)
newdata.append(rec)
return newdata
class TestStyleSheetMF(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.model = TestModel(TESTDATA)
uic.loadUi("test_stylesheets.ui", self)
self.listView.setModel(self.model)
self.listView.setModelColumn(0)
self.btSave.clicked.connect(self.save_name)
def save_name(self):
vorname = self.edVorname.text()
nachname = self.edNachname.text()
modlog.debug("Vorname: %s, Nachname: %s",
vorname, nachname)
self.model.appendRow((vorname, nachname))
self.log_name(vorname, nachname)
def log_name(self, vorname, nachname):
self.txLog.appendPlainText(
f"Vorname: {vorname}, Nachname: {nachname}")
if __name__ == "__main__":
logging.basicConfig(level=logging.WARNING)
modlog.setLevel(logging.DEBUG)
app = QtWidgets.QApplication(sys.argv)
mainwin = TestStyleSheetMF()
mainwin.show()
app.exec()
Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>451</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<property name="styleSheet">
<string notr="true">QListView {
alternate-background-color: lightGoldenrodYellow;
}
#namensfeld {
border: 3px solid darkBlue;
border-radius: 4px;
background-color: aliceBlue;
}
#textfeld {
border: 3px solid firebrick;
border-radius: 4px;
background-color: mistyRose;
}
</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QListView" name="listView">
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QFrame" name="namensfeld">
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Vorname</string>
</property>
<property name="buddy">
<cstring>edVorname</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="edVorname"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Nachname</string>
</property>
<property name="buddy">
<cstring>edNachname</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="edNachname"/>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="btSave">
<property name="text">
<string>Speichern</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="textfeld">
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPlainTextEdit" name="txLog">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>