Seite 1 von 1

[QT4] Defaulttext für Statusbar

Verfasst: 3. Februar 2009 21:37
von Crazykriz
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?

Verfasst: 3. Februar 2009 21:55
von franzf
Qt Assistant -> QStatusBar (Doku halt) -> permanent messages.
Im prinzip also ein

Code: Alles auswählen

mainWindow->statusBar()->addPermanentWidget(new QLabel("Default Status Text"));
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 ;)

Verfasst: 3. Februar 2009 22:22
von Crazykriz
Danke, werde es ausprobieren. 8)

---------
Edit

Das sieht schonmal gut aus, aber irgendwie kann man den Defaultrahmen des Labels nicht entfernen (Problem wurde hier schonmal angesprochen, aber nicht gelöst). Brrrr :roll:

Hat jemand dafür noch eine Lösung parat?

Verfasst: 4. Februar 2009 08:52
von franzf
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).
Ein QLabel ist ein QFrame, somit kannst du shape/shadow/style/width des Labels verändern.
Schau mal in der Doku :)

Grüße
Franz

Verfasst: 5. Februar 2009 01:07
von Crazykriz
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:

Code: Alles auswählen

labelDefStatus.setFrameStyle(QFrame::NoFrame | QFrame::Plain);
labelDefStatus.setFrameShadow(QFrame::Plain);
labelDefStatus.setFrameShape(QFrame::NoFrame);
labelDefStatus.setLineWidth(0);
labelDefStatus.setMidLineWidth(0);
Also mehr kann ich leider nicht abschalten :D

-------

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)

Verfasst: 5. Februar 2009 09:03
von franzf
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:

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 );
}
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

Verfasst: 5. Februar 2009 09:07
von upsala
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?)

Verfasst: 11. Februar 2009 22:55
von Crazykriz
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?)
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.
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.