Qt: Fensterminimierung abfangen



  • Hallo nochmal,
    ich habe hier noch ein weiteres Problem: Ich würde gern das Minimieren meines Programmfensters abfangen - für das Schließen gibt es ja das QCloseEvent, aber für das Minimieren habe ich nichts dergleichen gefunden. Außerdem scheint das Minimieren auch kein QResizeEvent auszulösen, sodass auch dieser Ansatz nicht funktioniert.
    Kann mir jemand einen Tipp geben?



  • Du suchst QHideEvent (-> QWidget::hideEvent() implementieren).
    Das Gegenstück ist dann QShowEvent.



  • Ich danke dir, ich probiere es mal aus.



  • Zumindest unter Linux konnte ich QHideEvent nicht nutzen, da scheinbar beim Minimieren kein solches Event ausgelöst wird. Ich habe mir nun mit

    void MainWindow::changeEvent(QEvent * event)
    {	if(event->type() == QEvent::WindowStateChange)
    		MinimizeTest();
    	event->accept();
    }
    

    beholfen, jedoch bleiben damit ein paar Schwierigkeiten.

    Das Abfangen des Minimierens soll dazu dienen, das Programm zu einem Icon im Systemtray zu machen. Während dies unter Linux reibungslos klappt, funktioniert es unter Windows 7 nicht (nur unter diesem Windows habe ich getestet). Es sieht danach aus, dass das Fenster erst versteck wird und aus der Taskleiste verschwindet (im MinimizeTest() wird hide() aufgerufen), dann jedoch sofort wieder in der Taskleiste auftaucht. Will ich dieses Fenster nun öffnen, sehe ich nur den Rahmen, jeglicher Inhalt fehlt (ist offensichtlich noch versteckt).
    Scheinbar hat zumindest Windows 7 etwas gegen den hide()-Befehl - weiß da jemand Abhilfe?



  • Minimiere mal deinen Code aufs Nötigste und poste den dann hier. Damit man sehen kann wie du das genau anzustellen versuchst 😉
    Die Qt-Beispiele zum TrayIcon kennst du ja schon. Das geht normalerweise über das closeEvent.
    BTW: welche Qt-Version verwendest du? Nicht dass das eine ältere Version ist, die noch vor Win7 Released wurde 😉



  • Qt 2010.01 (4.6.1 müsste das sein), die neue Version habe ich noch nicht installiert.

    An Code gibt es da nicht viel - ich werde mal versuchen, ob es mit QCloseEvent das Problem nicht gibt, aber es scheint mir so, als wäre Windows daran schuld.

    //Erstellung der Objekte
    systray = new QSystemTrayIcon(QIcon::QIcon("SysTray.png") , this);
    TrayMenu = new QMenu(this);
    systray->setContextMenu(TrayMenu);
    systray->hide();
    
    //Funktionen
    
    void MainWindow::changeEvent(QEvent * event)
    {	if(event->type() == QEvent::WindowStateChange)
    		MinimizeTest();
    	event->accept();
    }
    
    void MainWindow::MinimizeTest()
    {	if(this->isMinimized() == true)
    	{	systray->show();
    		this->hide();
    	}
    }
    


  • Ich habe das Problem jetzt mehr oder minder gelöst. Warum muss das unter Windows nur so schwierig sein...

    Aus mir unbekannten Gründen hat Windows (XP und 7 habe ich getestet) jegliche showMinimized(), showMaximized(), showNormal(), hide() und setVisible()-Befehle ignoriert (bei letzteren beiden wurde nur der Fensterinhalt versteckt, das Fenster blieb aber da). Der einzig funktionierende Weg war nun, das CloseEvent auszulösen, wenn ich irgendetwas erreichen wollte. Zusammen mit ein paar Bools konnte ich so das Schließen "antäuschen" und dann wurde auch der hide()-Befehl richtig umgesetzt (die anderen habe ich nicht probiert, die brauchte ich ja nicht). Warum nun bei einem ausgelösten CloseEvent das Verstecken funktioniert und sonst nicht... 😕
    Mein braves Linux hat im Gegensatz zu Windows auf sämtliche Befehle richtig reagiert, das hat sich ein paar Streicheleinheiten verdient ;).


Anmelden zum Antworten