In den Tray minimieren / Von Taskleiste entfernen

Alles rund um die Programmierung mit Qt
Antworten
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

In den Tray minimieren / Von Taskleiste entfernen

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Damit schon mal probiert: QWindowStateChangeEvent?
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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..
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was stört euch immer daran, eine Methode zu überladen? Das ist meist weniger (Schreib-)Arbeit als die ganzen Diskussions-Threads dazu.
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
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.
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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;
}
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

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.
Antworten