Seite 1 von 1

[gelöst] Programm beendet sich selbst

Verfasst: 17. Juni 2008 12:55
von Teetrinker
Ich habe ein Problem mit meinem Programm und finde den Fehler nicht, ich verwende Qt4.3 und habe folgendes Problem:
Ich verstecke das Hauptfenster mit setVisible(true); so das nur das TrayIcon sichtbar ist:

Code: Alles auswählen

void Prog::CreateTray(){
QMenu *TrayIconMenu = new QMenu(this);

QAction *aEntry = new QAction(QIcon(":/Icons/add.png"), tr("&Test"), this);
connect(aEntry, SIGNAL(triggered()), this, SLOT(Entry()));
	
TrayIcon = new QSystemTrayIcon(this);
TrayIconMenu->addAction(aEntry);
		
TrayIcon->setContextMenu(TrayIconMenu);
TrayIcon->setIcon(QIcon(":/Icons/Icon.png"));
TrayIcon->show();
}

Code: Alles auswählen

void Prog::Entry(){
//	show();
	bool ok;
    QString text = QInputDialog::getText(this , "Test", "Geben Sie ein Wort ein.", QLineEdit::Normal, "", &ok);
}
Wenn ich nun im TrayMenü den Befehl "Test" auswähle, dann öfnet sich der QInputDialog wie gewünscht. Wenn ich diesen Dialog aber mit Okay oder Abbrechen beende, dann beendet sich auch mein Programm. Wenn ich jetzt allerdings setVisible(true); rausnehme, also das Hauptfenster (Dialog) sichbar ist und dann im Traymenü "Test" auswähle, dann geht alles wie gewünscht und mein Programm beendet sich nicht von selber.

Anderer Versuch: Wenn ich setVisible(true); wieder reinnehme (Fenster ist also unsichtbar) und die Routine Entry() direkt aufrufe, ohne das ich es im Traymenü anklicke, dann geht auch alles wie es soll. Nur wenn ich manuell den Menüeintrag auswähle und anklicke beendet sich mein Programm. Was mache ich da falsch?

Bin für Hinweise dankbar,
Teetrinker

Verfasst: 17. Juni 2008 13:17
von solarix
ich verstecke das Hauptfenster mit setVisible(true);
eher setVisible(false)?

Weil ich nirgendwo ein "setVisible()" in deinem Code sehe ist mir der Ablauf nicht klar, aber es klingt irgendwie nach:
http://doc.trolltech.com/4.3/qapplicati ... losed-prop

Verfasst: 17. Juni 2008 13:46
von Teetrinker
Hi und danke erstmal für deine Rückmeldung. Ich habe versucht nur den wesentlichen Teil aus meinem Programm hier zu posten, weswegen natürlich einiges fehlt.
Man kann das Hauptfenster durch Klick aufs Trayicon sichtbar und unsichtbar schalten, daher setVisible.

Also der Start des Programmes sieht so in der main.cpp aus

Code: Alles auswählen

int main(int argc, char ** argv)
{
	QApplication app( argc, argv );
	Prog win;
//	win.show(); 
	app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
	return app.exec();
}
Danach wird im Hauptprogramm Prog.cpp u.a. die Routine für das TrayIcon aufgerufen:

Code: Alles auswählen

Prog::Prog( QWidget * parent, Qt::WFlags f) 
	: QDialog(parent, f)
{
	setupUi(this);
CreateTray();
	
}
Wenn ich also über das Traymenü die Funktion Entry() durch die Connection aufrufe (und das Hauptfenster unsichtbar ist), dann beendet sich das Programm selber, nachdem ich den Dialog weggeklickt habe. Starte ich die Funktion Entry() allerdings direkt (z.B. direkt nach CreateTray();) dann läuft alles wie es soll - selbst wenn das Fenster unsichtbar ist.

Und an quitOnLastWindowClosed hatte ich auch schon gedacht, weswegen ich kurzzeitig die Connection (app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );) ausgenommen hatte, aber das brachte leider auch nichts.

Verfasst: 17. Juni 2008 16:01
von solarix
Und an quitOnLastWindowClosed hatte ich auch schon gedacht, weswegen ich kurzzeitig die Connection (app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );) ausgenommen hatte, aber das brachte leider auch nichts.
ich glaube du hast die doku da nicht verstanden, das macht QApplication per default... ich dachte da eigentlich eher an:

Code: Alles auswählen

QApplication app( argc, argv ); 
app.setQuitOnLastWindowClosed (false);

Verfasst: 17. Juni 2008 16:16
von Teetrinker

Code: Alles auswählen

QApplication app( argc, argv ); 
app.setQuitOnLastWindowClosed (false);
Sei bedankt, das wars. Auch wenn ich nicht verstehe wieso das Programm weiterlief, wenn ich die Funktion direkt aufgerufen habe. Eigentlich hätte sich das Programm da auch beenden müssen.