2015-08-19 18 views
5

Gibt es eine Möglichkeit, die Hintergrundfarbe eines Widgets zu ändern, ohne dabei seinen Stil zu verlieren? Mein Problem ist unter Windows 7/Vista mit Aero Theme und auch unter Windows 8 reproduzierbar. Sie können sehen, wie es in Qt Designer aussieht:Wie Windows Aero Thema nach Einstellung der Hintergrundfarbe der Schaltfläche in Qt beibehalten?

Background colour is the only difference between top and bottom buttons

Hier haben wir vier Tasten haben: Beide Top-Widgets sieht gut aus (wie alle anderen Widgets dieses Programms), aber beide untere Widgets sieht alt. Der einzige Grund für diesen alten Stil ist die Einstellung der Hintergrundfarbe dieser Schaltflächen (so weit ich weiß, setzt der Desktop Window Manager den Stil auf alt zurück, wenn das Widget nicht Standard ist).

Gibt es also eine Möglichkeit, Desktop Window Manager zu zwingen, eine Schaltfläche mit nicht standardmäßiger Hintergrundfarbe zu zeichnen? (Microsoft Office kann es tun, aber ich bin mir nicht sicher, dass es Standardfunktion ist)

Können Sie Qt-Erweiterung empfehlen, die Standardzeichnung von Schaltflächen durch moderne (Aero-Thema) ersetzt? Oder wissen Sie vielleicht mehr Standard Weg, es zu tun?

Ich fand nur eine Möglichkeit, die Farbe zu ändern, ohne den Stil zu verlieren: ein teiltransparentes Widget über die Schaltfläche zu setzen (und es für Mausklicks transparent zu machen). Sie können das Ergebnis hier sehen (mein Rahmen ist größer, als es notwendig ist - es für die Demonstration ist, auch ich brauche Farbkorrektur Transparenz zu kompensieren, aber es ist nicht entscheidend):

Workaround (semi-transparent frame is above buttons)

Es funktioniert, aber Ich mag diese "Lösung" nicht. Hast du eine bessere Idee?

+1

Leider [Windows-nicht unterstützt nativ die] (http://stackoverflow.com/q/18745447/1329652), so was auch immer Lösung wird kommen Sie mit hat Ihre eigenen. Das Beste, was Sie tun können, ist, die Schaltfläche auf ein Bild/eine Pixmap zu zeichnen und sie dann so zu färben, wie Sie es wünschen. –

Antwort

1

Gibt es eine Möglichkeit, Desktop Window Manager zu zwingen, die Schaltfläche mit nicht standardmäßiger Hintergrundfarbe zu zeichnen? (Microsoft Office kann es tun, aber ich bin nicht sicher, ob es standardmäßig ist)

Sie können Ihren eigenen QProxyStyle schreiben und WinAPI Funktionen verwenden, um Tasten mit aero-Stil und individuelle Hintergrundfarbe zu zeichnen. Sie können Qt-Quellen betrachten, um zu sehen, wie es für Aero gemacht wurde. Aber es ist eine sehr komplexe Aufgabe.

Stylesheets sind nicht für die Verwendung mit Animationen vorgesehen (z. B. Hover-Animation in Aero).

Können Sie Qt-Erweiterung empfehlen, die Standardzeichnung von Schaltflächen durch moderne (Aero-Thema) ersetzt? Oder können Sie mehr Standard Weg wissen, es zu tun?

Es gibt keinen Standardweg. Wenn Sie Stylesheets ohne solche unvorhersehbaren Probleme verwenden möchten, müssen Sie den Stil "Fusion" anstelle von nativen Stilen verwenden. Der "Fusion" -Stil ist eine gute Grundlage für die QSS-Anpassung. See documentation

Andere Chance - ist QtQuick anstelle von Widgets zu verwenden.

+0

Vielen Dank für diese Ideen und Links! Leider "Fusion" -Stil und Aero-Thema in Windows sind anders. Könntest du bitte erklären, wie 'QtQuick' hier helfen kann? – Ilya

+0

'QtQuick' ist ein neuer Teil des Qt-Frameworks, der für die moderne plattformübergreifende GUI-Entwicklung geschaffen wurde. Sie können Qt-Dokumentation und Beispiele lesen. –

2

Ich sehe, dass Sie Stylesheets verwenden, um die Hintergrundfarbe der Schaltflächen zu ändern. Ich hatte vor einiger Zeit das gleiche Problem. Sobald Sie ein Stylesheet anwenden, verliert die Schaltfläche den 3. Effekt und Sie sehen keinen Hover-Effekt mehr. Meine Annahme war es, mit Stylesheets zu verwerfen und QPalette verwenden, um die Farben festzulegen.Zum Beispiel

QPalette bluePalette(button->palette()); // original palette 
bluePalette.setColor(QPalette::Button, QColor(Qt::blue)); //colour you want 
button->setPalette(bluePalette); 
+1

Vielen Dank für diese Idee! Leider ist der Aero-Stil "mächtiger" als "setPalette()". Ich habe diese Idee auch früher überprüft: Im klassischen Thema haben wir einen blauen Knopf, aber im Aero-Thema können wir nur Knopf mit Standardhintergrundfarbe sehen. Es sieht so aus, dass der Desktop Window Manager die Widget-Palette ignoriert. – Ilya