Hallo,
dank des System Tray Icon Example von Qt hab ich zumindest das Icon erschaffen können. Im Beispiel wird das Fenster ausgeblendet, wenn man es schließen will, und zwar mit hide().
Ich möchte es nun aber ausblenden, wenn es minimiert wird. Hab schon sämtliche events versucht abzufangen, aber irgendwie funktioniert das nicht, wenn man z.B. event(), hideEvent() o.ä. überschreibt und dort ggf. hide() ausführt, bleibt das Fenster in der Taskleiste und beim Versuch es wiederherzustellen wird es nicht mehr repainted.
Am besten wäre es natürlich, wenn das Fenster dazu auch noch sichtbar in den Tray minimiert wird, d.h. mit einer entsprechenden Animation in den Tray verschwindet statt auf die Taskleiste, aber das wird wohl nicht mit Qt funktionieren - bei Last.fm (auch Qt verwendet) haben die das irgendwie hinbekommen, weiß aber nicht ob nur unter Win. Die scheinen aber auch eigene Tray-Routinen geschrieben zu haben für jedes System...
Naja das ist aber nicht so wichtig - wichtig ist dass das Fenster nach oder besser vor dem Minimieren von der Taskleiste verschwindet.
MfG,
FaS
In den Tray minimieren / Von Taskleiste entfernen
Threads nüchtern zu lesen erspart auch eine Menge SchreibarbeitWas stört euch immer daran, eine Methode zu überladen? Das ist meist weniger (Schreib-)Arbeit als die ganzen Diskussions-Threads dazu.
Wie gesagt funktioniert es eben nicht - mir ist es eigentlich (fast) egal wie die Lösung aussieht, ich möchte einfach nur dass das Fenster vor/nach dem Minimieren von der Taskleiste verschwindet.
Wenn ich hide() in einer überladenen event()-Funktion aufrufe, verschwindet das Fenster zwar, aber taucht sofort danach wieder in der Taskleiste auf, im minimierten Zustand. (Stelle ich es dann wiederher, so wie man minimierte Fenster halt wiederherstellt, wird es ab da an nicht mehr repainted.)
Code: Alles auswählen
bool MainWindow::event( QEvent *event )
{
QWidget::event( event );
if( event->type() == QEvent::WindowStateChange )
if( (windowState() & Qt::WindowMinimized) != 0 )
hide();
//QWidget::event( event ); // nützt auch hier nichts
return true;
}Code: Alles auswählen
QTimer::singleShot( 0, this, SLOT(hide()) );Und noch etwas: Ich würde gern im Kontextmenü des Tray-Icons Wiederherstellen/Maximieren/Minimieren-Felder ggf. disablen.
isMaximized() liefert in den events aber nicht rechtzeitig bzw. erst danach den neuen Zustand, sofern er gerade verändert wird. Weiß da jemand was?
MfG,
Fabian
Ja. Stell es dir einfach als eine Schlange vor, in dem das Event mit dem hide vor dem minimieren kommt. Durch den Timer stellt sich das hide hinter das minimieren.FaS hat geschrieben:Wenn ich ihm etwas Zeit gebe und hide() mit einem Umweg über einen Timer auslöse, funktioniert das - wird solch eine Lösung als "sauber" empfunden?
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Also, der Code unten funktioniert jetzt fast. Das Problem ist nun, dass wenn das Fenster maximiert war, es beim Minimieren immernoch den Zustand Qt::WindowMaximized hat, zumindest während der event()-Funktion. D.h. dass ein zuvor maximiertes und nun minimiertes Fenster mit unten stehendem Code nicht als solches erkannt wird.
Code: Alles auswählen
bool MainWindow::event( QEvent *event )
{
if( event->type() == QEvent::WindowStateChange )
if( (windowState() & Qt::WindowMinimized) != 0 )
QTimer::singleShot( 0, this, SLOT(hide()) );
QWidget::event( event );
return true;
}Hast Du es in dem Beispiel auch schon versucht die Funktion der Basisklasse vor deinem Code auszuführen?
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.