window-minimierung verhindern

Alles rund um die Programmierung mit Qt
Antworten
samsamsam
Beiträge: 43
Registriert: 9. Juni 2009 16:22
Wohnort: Dortmund

window-minimierung verhindern

Beitrag von samsamsam »

hallo,

ich versuche ein QSystemTrayIcon zu implementieren, welches in kraft tritt, wenn der user das programm minimiert. dabei habe ich ein problem: wenn ich das event abfange, wenn das fenster minimiert wird, kann ich zwar das fenster auf setVisible(false) bzw. hide() setzten, das fenster ist aber unten in der taskleiste immernoch aufgeführt und kann durch doppelklick drauf wieder restored werden... das ist unerwünscht. mein zuieo ist es, beim minimieren des fensters das fenster gleich unsichtbar zu machen und so lange unsichtbar zu erhalten, bis über die menubar des trayicons das fenster wieder angefordert wird. hat jemand eine idee?

hier der code, der nicht so ganz klappt:

Code: Alles auswählen

void MainWindow::changeEvent(QEvent *ev)
{

......
//das fenster ist also minimiert, dann folgendes ausführen
if(!m_trayIcon.shutDownRequested() )
				{
			
					if (m_trayIcon.isVisible()) {
					
// kleine message anzeigen, dass das programm weiter läuft
						m_trayIcon.showMessage( tr("Program remains running"), tr("The program will keep running in the "
							"system tray. To terminate the program, "
							"choose <b>Quit</b> in the context menu "
							"of the system tray entry."));
//fenster verstecken
						hide();
						m_trayIcon.setRestoreUiActionEnabled(true);
						
					}

				}
}
samsamsam
Beiträge: 43
Registriert: 9. Juni 2009 16:22
Wohnort: Dortmund

Beitrag von samsamsam »

in anderen worten, ich möchte das minimierungsevent in ein closeevent umleiten, so dass der minimierungs-event niemals ausgeführt wird sondern der closeevent stattdessen gemacht wird
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

hide() ist falsch, du willst close().
Wie das dann weiter geht, schaust dir dir vom desktop/systray-Beispiel ab.
samsamsam
Beiträge: 43
Registriert: 9. Juni 2009 16:22
Wohnort: Dortmund

Beitrag von samsamsam »

hab einen denkfehler gemacht: close() darf ich nicht aufrufen, sonst beendet das programm (lastwindowclosed()...).

gibt es einen weg, um einen vom benutzer gewollten minimierung vorzubeugen, also erst garnicht zuzulassen, dass windowState() == Qt::WindowMinimized wird?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

samsamsam hat geschrieben:hab einen denkfehler gemacht: close() darf ich nicht aufrufen, sonst beendet das programm (lastwindowclosed()...).
Nein, wenn du im closeEvent() das übergebene Event ignore()ierst, schließt sich nix.
gibt es einen weg, um einen vom benutzer gewollten minimierung vorzubeugen, also erst garnicht zuzulassen, dass windowState() == Qt::WindowMinimized wird?
So was ist immer ziemlich böse, da der Nutzer das Programm nicht gewohnt bedienen kann, es ist absolut Userunfreundlich. So aufdringliche Programme, die immer ganz vorne bleiben wollen, werden bei mir einmal gestartet, dann gleich wieder deinstalliert. Der Systray ist genau das was du willst. Das Programm läuft weiter, der User bekommt eine Mitteilung, dass dies so ist, und alles ist schön.
Ich hab in das systray-example einfach nur die changeEvent() eingebaut, die bei passender Umgebung (QEvent::WindowStateChange + Qt::WindowMinimized) ein close() ausführt, und jetzt verschwindet das Fenster aus der Fensterliste und minimiert sich in den Tray. Basta :)

// Nachtrag:
Desweiteren trickst dich der Windowmanager aus. Wenn ich hier versuche, beim changeEvent das event zu ignorieren (was ja geht) ist mein Fenster schon inaktiv geworden, aber immer noch in der Fensterliste. Das heißt, es liegt hinter den anderen Fenstern. Es obliegt auch dem WindowManager, Flags wie z.B. Qt::WindowStaysOnTopHint zu ignorieren.
Wenn du eh schon dein Fenster immer oben behalten willst, brauchst du im Übrigen kein TrayIcon ;)
Antworten