antialiasing ohne unterklassen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
flying sheep
User
Beiträge: 48
Registriert: Donnerstag 17. September 2009, 16:44
Kontaktdaten:

ich weiß, dass ichs schonmal gemacht hab, aber trotz (erfolgloser) suche nach dem alten code und intensiven googelns find ich keine möglickeit, wie ich z.b. ein

Code: Alles auswählen

QLabel {border-radius:5px}
dazu bringe, antialiased zu sein.

PS: code ist natürlich css, nicht ruby, aber die farben passen, und css ist im forum nicht unterstützt

PPS: @alle korinthenkacker: ich weiß, dass qt-stylesheets kein wirkliches css sind
lunar

Hast Du einen Screenshot davon, wie es tatsächlich aussieht, und kannst Du dann nochmal sagen, was Du im Unterschied dazu erwartest?

Beim meinem kurzen Versuch sah das Ergebnis nämlich danach aus, als wäre Kantenglättung aktiv, ohne das zusätzliche Anweisungen erforderlich gewesen wären.

Ich wüsste jetzt auch nicht, wie man Qt dazu zwingen könnte, ein Steuerelement mit Kantenglättung zu zeichnen, denn darum kümmert sich das Zeichensystem normalerweise selbst. Explizit aktivieren muss man Kantenglättung meines Wissens eigentlich nur, wenn man mit QPainter auf Steuerelemente zeichnet.
flying sheep
User
Beiträge: 48
Registriert: Donnerstag 17. September 2009, 16:44
Kontaktdaten:

strange. bei mir eben nicht. nutze pyqt 4.6 für/und python 3.1 screenie hier:
Bild
code des balkens hier:

Code: Alles auswählen

self.grabber = QLabel()
self.grabber.setStyleSheet("QLabel {background-color:rgba(0,0,0,128); border-radius:5px}")
lunar

Nun, unter Linux mit PyQt 4.6 und Qt 4.6 sieht ein grober Nachbau Deines Dialogs so aus:
Bild
Quelltext ist der selbe, ohne irgendwelchen besonderen Anweisungen. Insofern kann ich Dir wohl nicht weiterhelfen.
flying sheep
User
Beiträge: 48
Registriert: Donnerstag 17. September 2009, 16:44
Kontaktdaten:

danke, lunar.

dann halt nicht. blödes windows. morgen kommt die beta von lucid raus, dann kann ich wieder da programmieren. (mein alter laptop ist kaputt und ich hab meinen neuen schon, wollte da aber zumindest bis zur beta warten, um kubuntu nicht 2 mal in zwei wochen neu installieren zu müssen)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Hier findest du ein kurze Auflistung zum Antialiasing und den einzelnen Qt-Objekten: http://qt.nokia.com/developer/faqs/554

Für Windows übernimmt das Glätten Qt selbst, was Deinem Bild nach wohl völlig unbrauchbar ist. Eventuell ist das auch mit einer neueren Qt-Version behoben worden (kann es grad nicht testen, da ich nur die 4.4 auf Windows habe). Selbst auf meinem Linux-Arbeitsrechner sieht es zum Fürchten aus, offenbar unterstützt das Hostsystem die nötige XRender-Erweiterung nicht (kA ob es am alten X11, der Grafikkarte oder beidem liegt.)

Falls die runden "Ecken" für Dich ein must-have sind, könntest Du das Zeichnen des Widgets in der paintEvent-Methode selbst übernehmen und das Antialiasing mittels

Code: Alles auswählen

p = QtGui.QPainter()
p.setRenderHint(QtGui.QPainter.Antialiasing, True)
aktivieren.

Hier mal ein kleines Beispiel: http://paste.pocoo.org/show/191808/

Der Code gewinnt keinen Schönheitspreis, sondern soll nur das Prinzip verdeutlichen. Bei einfachen Widgets wie QLabel ist das schnell gemacht (siehe MyLabel). Für komplexere Widgets wie Buttons (siehe MyButton) ist es weitaus aufwändiger, da man alle möglichen Veränderungen und Zustände in der paintEvent-Methode abbilden musst, um halbwegs API-konformes Verhalten des Widgets zu ermöglichen. (Einen Button z.B. würde man eher von QAbstractButton und nicht von QPushButton ableiten, nur wollte ich nicht die halbe Button-API nachimplementieren, um den Effekt zu zeigen). Das früher nötige Doppelpuffern bei Zeichenaktionen an sichtbaren Widgets entfällt, da sich Qt jetzt selbst darum kümmert.
Für grössere Eingriffe in die Darstellung ist dieses Vorgehen allerdings nicht geeignet, dafür bietet Qt die QStyle-Klasse.

Hilft das alles nichts und man stößt an die Grenzen des mit Qt-Widgets Machbaren, kann man immer noch auf das Graphicsframework oder QWebkit zurückgreifen.

Zurück zu Deinem Problem:
Vielleicht reicht das "paint patching" für Deinen Fall, generell würde ich davon eher abraten, da es mitunter mehr Probleme aufwirft als es löst. Ist der Weg über ein eigenes QStyle nicht gerechtfertigt, würde ich auf ein solches Darstellungsdetail ganz verzichten.

Grüße jerch
Zuletzt geändert von jerch am Samstag 20. März 2010, 20:43, insgesamt 1-mal geändert.
flying sheep
User
Beiträge: 48
Registriert: Donnerstag 17. September 2009, 16:44
Kontaktdaten:

danke. durch ersetzen des titelleistenwidgets wollte ich eigentlich nur verhindern, dass das widget geschlossen wird, da es eig. nur ein dockwidget ist damit man sich aussuchen kann, ob man die kontrollen oben oder unten hat. und ich wollte es halt schönen, wo ich grad dabei war.

da ich dafür ein flag gefunden habe ist es nicht mehr so wichtig (da jetzt das standardwidget auch keinen close-button mehr hat)
Antworten