Seite 1 von 1

In den Tray minimieren / Von Taskleiste entfernen

Verfasst: 11. Juli 2007 20:27
von FaS
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

Verfasst: 11. Juli 2007 20:47
von upsala
Damit schon mal probiert: QWindowStateChangeEvent?

Verfasst: 12. Juli 2007 09:56
von FaS
Das kann man nicht besser abfangen als über das Überschreiben von event() oder? Und was dabei passiert, bzw. nicht passiert, habe ich bereits gesagt.
Aber trotzdem danke, vielleicht überseh ich auch irgendwas..

Verfasst: 12. Juli 2007 12:17
von upsala
Was stört euch immer daran, eine Methode zu überladen? Das ist meist weniger (Schreib-)Arbeit als die ganzen Diskussions-Threads dazu.

Verfasst: 12. Juli 2007 13:13
von FaS
Was stört euch immer daran, eine Methode zu überladen? Das ist meist weniger (Schreib-)Arbeit als die ganzen Diskussions-Threads dazu.
Threads nüchtern zu lesen erspart auch eine Menge Schreibarbeit ;-)
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;
}
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?

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

Verfasst: 12. Juli 2007 13:30
von macman
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?
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.

Verfasst: 12. Juli 2007 15:26
von FaS
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;
}

Verfasst: 12. Juli 2007 15:58
von macman
Hast Du es in dem Beispiel auch schon versucht die Funktion der Basisklasse vor deinem Code auszuführen?