[QT4] Defaulttext für Statusbar
[QT4] Defaulttext für Statusbar
Nabend,
vorweg erstmal ein Schade, daß QT sowas Simples wie einen Defaulttext für Statusbars nicht anbietet (z.B. sowas wie statusbar->setDefaultMessage()), welcher immer dann angezeigt wird, wenn sonst kein Mausfokus über ein anderes Widget mit Statustext vorhanden ist.
Der Initialtext wie "Bereit." oder "Ready." wird ja spätestens dann gelöscht, wenn der erste Statustext eines Widgets angezeigt wird. Danach ist die Statusbar ja mehr oder weniger leer.
Frage ist: Wie kann ich erreichen, daß standardmäßig immer ein Defaulttext angezeigt wird bzw. welcher Ansatz wäre nötig?
vorweg erstmal ein Schade, daß QT sowas Simples wie einen Defaulttext für Statusbars nicht anbietet (z.B. sowas wie statusbar->setDefaultMessage()), welcher immer dann angezeigt wird, wenn sonst kein Mausfokus über ein anderes Widget mit Statustext vorhanden ist.
Der Initialtext wie "Bereit." oder "Ready." wird ja spätestens dann gelöscht, wenn der erste Statustext eines Widgets angezeigt wird. Danach ist die Statusbar ja mehr oder weniger leer.
Frage ist: Wie kann ich erreichen, daß standardmäßig immer ein Defaulttext angezeigt wird bzw. welcher Ansatz wäre nötig?
Gruß
Crazykriz
Crazykriz
Qt Assistant -> QStatusBar (Doku halt) -> permanent messages.
Im prinzip also ein
Und immer wenn du statuBar()->clearMessage(); aufrufst (oder ein Widget mit statusTip() gehovert wird) siehst du genau dieses label.
Steht aber alles ganz schön in der Doku
Im prinzip also ein
Code: Alles auswählen
mainWindow->statusBar()->addPermanentWidget(new QLabel("Default Status Text"));Steht aber alles ganz schön in der Doku
Ein QLabel ist ein QFrame, somit kannst du shape/shadow/style/width des Labels verändern.Crazykriz hat geschrieben:Das sieht schonmal gut aus, aber irgendwie kann man den Defaultrahmen des Labels nicht entfernen (Problem wurde hier schonmal angesprochen, aber nicht gelöst).
Schau mal in der Doku
Grüße
Franz
Das ist richtig.
Aber (wie immer das böse Aber) reagiert QLabel nicht auf diese Einstellungen. Zumindest haben folgende Einstellungen bei mir zwar den Frame verändert, aber nicht vollständig entfernt:
Also mehr kann ich leider nicht abschalten 
-------
Ich vermute beinahe, daß die Statusbar dieses besondere Verhalten eines QLabels (oder eines anderen Widgets) hervorruft, sobald man das Widget hinzufügt. Aus den uralten MFC Zeiten kann ich mich noch erinnern, daß man sogenannte "Panels" einrichten musste, wenn man mehrere Items in der Statusbar anzeigen lassen wollte. Man kennt das ja bei Editoren so à la Cursorposition anzeigen usw., wo auch ein flacher Rahmen um das Item zu sehen war.
Ich denke, daß Statusbar jedes neue Widget als "Panel" auffasst (was ja im Kern nicht falsch ist) und so jedem einen Rahmen um die Ohren haut, den man wissentlich wohl nicht deaktivieren kann/darf/soll/wtf. Man müsste also eventuell direkt von QStatusbar ableiten und dieses Verhalten deaktivieren... Tja, wer weiß...
-------
Aus einer älteren Frage aus der Mailinglist von Trolltech habe ich gelesen, daß der Rahmen tatsächlich integraler Bestandteil nichttemporärer Widgets in der Statusbar ist und demnach auch nicht ohne massiven Eingriff entfernt werden kann. Aber ich gebe die Hoffnung nicht auf 8)
Aber (wie immer das böse Aber) reagiert QLabel nicht auf diese Einstellungen. Zumindest haben folgende Einstellungen bei mir zwar den Frame verändert, aber nicht vollständig entfernt:
Code: Alles auswählen
labelDefStatus.setFrameStyle(QFrame::NoFrame | QFrame::Plain);
labelDefStatus.setFrameShadow(QFrame::Plain);
labelDefStatus.setFrameShape(QFrame::NoFrame);
labelDefStatus.setLineWidth(0);
labelDefStatus.setMidLineWidth(0);-------
Ich vermute beinahe, daß die Statusbar dieses besondere Verhalten eines QLabels (oder eines anderen Widgets) hervorruft, sobald man das Widget hinzufügt. Aus den uralten MFC Zeiten kann ich mich noch erinnern, daß man sogenannte "Panels" einrichten musste, wenn man mehrere Items in der Statusbar anzeigen lassen wollte. Man kennt das ja bei Editoren so à la Cursorposition anzeigen usw., wo auch ein flacher Rahmen um das Item zu sehen war.
Ich denke, daß Statusbar jedes neue Widget als "Panel" auffasst (was ja im Kern nicht falsch ist) und so jedem einen Rahmen um die Ohren haut, den man wissentlich wohl nicht deaktivieren kann/darf/soll/wtf. Man müsste also eventuell direkt von QStatusbar ableiten und dieses Verhalten deaktivieren... Tja, wer weiß...
-------
Aus einer älteren Frage aus der Mailinglist von Trolltech habe ich gelesen, daß der Rahmen tatsächlich integraler Bestandteil nichttemporärer Widgets in der Statusbar ist und demnach auch nicht ohne massiven Eingriff entfernt werden kann. Aber ich gebe die Hoffnung nicht auf 8)
Gruß
Crazykriz
Crazykriz
Dann musst du dir mit einem ProxyStyle helfen.
Du leitest einfach von QCommonStyle (oder auch QStyle) ab, und implementierst auf einfach Weise alle virtuellen Methoden.
Das schaut dann etwa so aus:
Nur im drawPrimitive() frägst du nach den PE_Frame/PanelStatusBar-Teilen, und zeichnest einfach nix. Also nur ein "break;" oder wie du auch immer abfrägst. und dann wie oben noch drawPrimitiveElement für QApplication::style() aufrufen.
Der ganze Tanz führt dazu, dass du deine Applikation im eingestellten Style laufen lässt, und nur die StatusBar stylest. Kannst du natürlich jederzeit für andere Items genau so machen.
Grüße
Franz
Du leitest einfach von QCommonStyle (oder auch QStyle) ab, und implementierst auf einfach Weise alle virtuellen Methoden.
Das schaut dann etwa so aus:
Code: Alles auswählen
void ProxyStyle::drawComplexControl ( ComplexControl control, const QStyleOptionComplex * option, QPainter * painter, const QWidget * widget = 0 )
{
QApplication::style()->drawComplexControl( control, option, painter, widget );
}Der ganze Tanz führt dazu, dass du deine Applikation im eingestellten Style laufen lässt, und nur die StatusBar stylest. Kannst du natürlich jederzeit für andere Items genau so machen.
Grüße
Franz
Der Rahmen kann zwar geändert, aber nicht entfernt werden. Ich bin mir sicher, daß du das im Rahmen eines Selbstversuches wahrscheinlich auch rausfinden würdest.upsala hat geschrieben:Der Rahmen kann sicher über QStyle geändert werden. Manchmal frag ich mich allerdings warum sich manch einer nur auf solche Kleinigkeiten konzentriert und nicht auf ein sauber geschriebenes Programm (warum ist labelDefStatus eigentlich kein Pointer?)
Derweil konzentriere ich mich auf solche "Kleinigkeiten", weil es seitens von Qt keine simple Lösung gibt, einen entsprechenden Defaulttext für "Idle" Phasen des Statusbar anzubieten. Also heißt das Motto des Tages: Selbermachen macht schlank.
Und saubere Programme schreiben ist echt eine super Sache! Ich frage mich nur gerade, woher du meinen Codingstil kennst, um sowas vom Stapel zu lassen...
Und letztendlich: labelDefStatus ist kein Pointer, weil das Objekt zu Versuchszwecken herhalten soll und da sehe ich keinen Sinn drin, den armen Heap mit sowas zu fragmentieren.
Zurück zum Thema: Ich habe die Sache erstmal auf sich beruhen lassen. Eventuell schaue ich mir die Sache nochmals an, wenn alles andere erledigt ist. Soweit ist es ja optisch auch nicht schlimm, wenn kein Defaulttext existiert.
Gruß
Crazykriz
Crazykriz