Seite 1 von 1

[unvollendet] Schriftgröße animieren?

Verfasst: 21. Januar 2010 18:32
von lx2
Hi,

ich würde gern ein QLabel mit der Zeit in Größe oder Farbe ändern:

Code: Alles auswählen

#include <QPropertyAnimation>   // Animationen


QPropertyAnimation *animation = new QPropertyAnimation(ui->label, "???");

animation->setEasingCurve(QEasingCurve::OutQuad); // sanfter Übergang
animation->setDuration(3000); // 3-Sekunden

animation->setStartValue( ??? )
animation->setEndValue( ???);

animation->start();
Nur weiß ich nicht welche Eigenschaft ich nehmen soll?
Also alles da wo "???" steht.

Habt ihr ne Idee?

Verfasst: 21. Januar 2010 18:45
von franzf
size wär nicht schlecht :P
Schau dir einfach immer auch die Doku zu den Basisklassen an, da wirst du meistens fündig :)

Verfasst: 21. Januar 2010 19:24
von lx2
Sorry, hatte mich undeutlich ausgedrückt.

Ich will nicht die Labelgröße animieren, sondern den Text selber

Mit "size" werden sozusagen nur die grenzen des Labels animiert, der textliche Inhalt bleibt leider gleichgroß.


Ich hatte schon eine Idee, den styleSheet zu animieren.

Die Property "QLabel.styleSheet()" ist jedoch enin QString.

Anscheinend kann man so eine Property nicht so einfach animieren.
QString steht zumindest nicht in der unterstützten liste:
http://doc.trolltech.com/4.6/qvariantan ... ml#details

Ich hatte schon an soetwas gedacht:


Code: Alles auswählen

	QPropertyAnimation *animation = new QPropertyAnimation(ui->nummer, "styleSheet");


	animation->setEasingCurve(QEasingCurve::OutQuad);
	animation->setDuration(3000);

// Fade vonb schwarz zu dunkelgrün, wenn das geht, kann man das auch auf Textgrößen beziehen
	animation->setStartValue(
			QString("color:rgb(0, " + QString::number(0) + ", 0 )");
		   )
	);
	animation->setEndValue(
			QString("color:rgb(0, "+ QString::number(100)  + ", 0 )");
	);

	animation->start();

und gehofft, dass er den Integer interpoliert.
Aber leider ist das nichtmal syntaktisch korrekt.

versteht ihr worauf ich hinaus will ?
lg,alex

Verfasst: 23. Januar 2010 18:10
von lx2
Ich hab leider immer noch keine Möglichkeit mit dem Animation Framework (also hauptsächlich mit der Klasse QPropertyAnimation) gefunden, mein Ziel zu erreichen.

Das liegt warscheinlich daran, das diese recht neue Klasse (ich glaube erst mit Version 4.5 fest integriert) erstmals entstanden ist, um die Property "geometry" zu verändern -> hauptsächlich für Positionsanimation also


Was ich bei der Suche im internet gefunden habe war das QT Kinetic Projekt, was sowas wie ein "erweitertes" animations-framework für QT ist

http://qt.gitorious.org/qt/kinetic
http://labs.trolltech.com/page/Projects ... cs/Kinetic

Hat jemand damit schon Erfahrung gesammelt, oder in sein Projekt integriert?
Weiß grad nicht wie ich da anfangen soll.

Vielleicht auch vollkommen oversized ich will ja eigentlich nur einen kleine animierte Textänderung.

lg from munich,
lx


edit:

Ach ja übrigens, laut folgender Aussage kann man wirklich jeden beliebigen (Zahlen-)Wert animieren den es nur gibt , solange man "nur" eine Property dafür deklariert:

We did quite some profiling and performance is also much improved in that direction since the last version of this framework. When you want to animate “something”, the only thing you need now is to add a property and then use a QtPropertyAnimation on it.
Quelle: http://labs.trolltech.com/blogs/2009/02 ... -reloaded/

Wenn ich nur wüßste wie...

Verfasst: 24. Januar 2010 11:05
von lx2
Hat denn wirklich keiner eine Antwort ??? :cry:

Hat wenigstens schon jemand mal versucht, etwas in diese Richtung zu machen :?:

Verfasst: 24. Januar 2010 11:42
von franzf
Da nur der font ein Property ist denke ich nicht dass es eine Lösung mit existierenden Mitteln gibt.
Lösung:
Schreib dir eine eigene Lösung :)
Also nen "int fontSize" als Property in einer von QLabel abgeleiteten Klasse und dann dieses Property zur Animation verwenden.

Verfasst: 24. Januar 2010 18:17
von lx2
Das sagt sich so leicht: "leit mal ab und mach dir ne Property..."
Also wie ich eine Klasse ableite, weiß ich.

Wie ich jedoch diese Property definieren muss, dass sie direkt die Fontsize verändert, bzw. das ich darauf dann per QPropertyAnimation anwenden kann: leider keine Ahnung :cry:

Ich glaub kaum, dass mir da nur ein int fontSize reicht.
Ich brauch ja irgendeine Funktion oder irgendwie die Verknüfung direkt zur Schriftgröße.

Ich weiß das man Schriftgrößen entweder so verändern kann:

Code: Alles auswählen

 QFont myfont("Arial", 40);
 ui->label->setFont(myfont);
oder per StyleSheet:

Code: Alles auswählen

 #label{
 font-size:40;
 font-family:Arial;
 }

Damit muss ich doch irgendwie hantieren, oder nicht???


Übrigens, wer bisher mitgelesen hat, und nur keine Lust hatte schnell das ganze sebst nachzubauen, hier mal ein vorgefertigter Code zum ausprobieren, bzw zum ergänzen. Vielleicht schaft es ja jemand doch noch (Achtung QT 4.6):

Verfasst: 24. Januar 2010 18:18
von upsala

Verfasst: 24. Januar 2010 23:55
von lx2
Jetzt endlich hab ich durchgeblickt mit den Properties, danke für eure Infos!
Hab jetzt eine von QLabel abgeleitete Klasse die die Property fontSize hat.

Das einzige Problem ist jetzt, dass die Animation recht ruckhaft von statten geht.

Habt ihr ne Idee wie man das optimieren kann ???
Ich schätze ja, das es daran liegt, das ich mit Integers arbeitete, und die Fontsize wirklich neu setzte. Damit das flüssig ist müsste man wohl eher Zoomen ???

Im Anhang mal den Sourcecode:

Verfasst: 25. Januar 2010 09:55
von franzf
Das ganze wirkt recht rucklig, weil ein Font einfach nicht wirklich weich skaliert...
Nimm dir ne Textverarbetung und tipp deinen Text. Dann scroll über dem Fontsize-Combo, und du wirst das selbe Phänomen haben.

Willst du weiche Skalierung musst du schon mehr tricksen! Render den Text in ein Pixmap und skalier das. Oder selbiges mit nem QPainterPath. Das sollte dann wirklich weich kommen.
Dann musst du aber schauen, wie du nach der Animation wieder in den Textmode wechselst - falls du das tatsächlich brauchst für Textinteraktion etc.

//edit:
Ein weiterer Grund ist deine Duration! Rechne dir mal die Frequenz aus, mit der dein Bild aktualisiert wird, und vergleiche mit den 25, die das menschliche Auge für die Wahrnehmung einer flüssigen Bewegung braucht.
Du wirst sehen, dass du min. 3,5 mal schneller werden musst ;)
Und dann wird die Animation plötzlich schön flüssig (versuch mal statt 3000 mit 800). Die Probleme mit Fontanimation bleiben aber immer noch sichtbar, wenngleich weniger stark.

Verfasst: 25. Januar 2010 12:24
von lx2
Also das mit dem umrechnen in eine Pixmap hatte ich mir auch schon gedacht, nur leider nicht anwendebar auf meinen Fall.
Zum Hintergrund:

Ich schreibe ein Programm für Gedächtnisstraining, in dem Zahlen in periodischen Zeitabschnitten angezeigt werden (z.B. alle 800ms).

Jetzt hätte mein Auftraggeber gern soetwas wie eine 3Sekunden-Warnung, am besten durch Skalierung der Schriftgröße.

Also wenn nur noch 3 Sekunden zum memorieren übrigbleiben sollte die Schrift deutlich größer werden, damit man weiß: Aufgepasst, gleich ists aus! und sich geistig darauf vorbereiten kann.
Momentan setzte ich einfach die Textgröße in den letzten 3 Sek höher.
Da das aber sehr Ruckhaft ist (besonders wenn die Zeitintervalle nicht gerade 1000ms sind ) brauch ich eben eine Größenanimation.

D.h. ich kann keine Pixmap generieren, da während der Animation sich die Zahlen ändern.

Somit bleibt nur noch die Schriftgröße. Du hast mich aber auf zwei neue Fragen gebracht:

1. Gibt es sowas wie Schriftgröße 23,41
2. Ist die Framerate von QPropertyAnimation denn wirklich 25 FPS?
Kann ich die FPS-Rate einstellen??? Hab in der doku nichts gefunden.

EDIT:
Also habs mal schnell berechnen lassen. Sind so ca. 65 FPS, aber es varriert tatsächlich. Es gibt also keine festgelegte FPS. Ist bestimmt auch CPU abhängig. Dennoch interresiert mich Frage 1

Verfasst: 25. Januar 2010 14:54
von franzf
Du hast 3 Sekunden Animationsdauer. Insgesamt sollen in dem Zeitintervall 30-10=20 Animationsschritte stattfinden. Macht 20/3 = 6,666... Änderungen pro Sekunde. Wie kommst du auf 65FPS?

Zu den Fragen:
1) Schau dir die Doku zu QFont an und such in der Gegend von "setPointSize" ob du was findest...
2) Nein ist sie nicht! 25FPS ist das was das menschliche Auge als flüssig wahrnimmt. Manche Menschen können aber auch da noch Ruckler feststellen.

Ich würde mich jetzt nicht da so festbeißen! Ich finde diese Animation als unbedingtes Kriterium Quatsch! Vor allem wenn es solche für dich schweren Probleme nach sich zieht. Ich würde wenn Animation andere Möglichkeiten in Betracht ziehe. Ein leichtes im Sekundentank stärrker werdendes An- und Abschwellen sollte doch auch passen! Oder vllt. willst du dir sogar ein eigenes Widget schreiben, welches das nicht über eine Property-Animation sondern QTimer+selber malen erledigt. Da kannst du dann auch selber wunderbar mit QPainterPath arbeiten. Bei voller Sekunde einfach die neu Zeit in den Path legen.

Verfasst: 25. Januar 2010 15:14
von lx2
Deine Rechnung ist genau das was man zuerst vermutet.

Aber sie ist leider falsch.
Ich hab in meiner abgeleiteten Klasse einfach mal zählen lassen wieoft die Funktion aufgerufen wird. Und das waren 65/Aufrufe pro Sekunde.

Hab jetzt tatsächlich was in der Doku dazu gefunden:
Note that neither the interval between calls nor the number of calls to this function are defined; though, it will normally be 60 updates per second.
http://doc.trolltech.com/4.6/qabstracta ... ml#details


setPointSize ( int pointSize ). Also keine Komma-Werte.


Genau das gleiche mit StyleSheets:
Da wir nur
font-size: 10pt;
oder
font-size: 10px;
anerkannt

Komma-Werte machen aber leider keinen unterschied.
----

Da das ganze Thema mir schon ein bisschen auf den Keks geht, lass ich das jetzt erstmal. Vielleicht kommt ja mit QT 4.7 ne lösung. Die basteln eh grad an CSS3 ...

Verfasst: 25. Januar 2010 15:23
von franzf
lx2 hat geschrieben:setPointSize ( int pointSize ). Also keine Komma-Werte.
Wenn ich sage "in der Gegend von" mein ich natürlich nicht, dass du genau diese Zeile eng fixiert begutachten sollst, sondern deinen Blick nach oben und unten schweifen lassen sollst. Dann findest du das:
http://doc.trolltech.com/4.6/qfont.html#setPointSizeF
Aber wirklich helfen wird es dir nicht, denke ich...

Ich werd mal nachher schauen ob ich so einen pulsierenden Counter hinkrieg ;)

Grüße
Franz