closeEvent einer GUI mit Controller verknüpfen

Alles rund um die Programmierung mit Qt
Antworten
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

closeEvent einer GUI mit Controller verknüpfen

Beitrag von marvel »

ich habe eine klasse die eine gui darstellt. ich erzeuge in einer anderen klasse ein objekt davon. dann habe ich die closeEvent funktion reimplementiert. wenn ich das ganze kompilieren möchte bekomme ich einen linker error.

Code: Alles auswählen

1>gui_converter.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""protected: void __thiscall GUI_Converter::closeAll(void)" (?closeAll@GUI_Converter@@IAEXXZ)" in Funktion ""protected: virtual void __thiscall GUI_Converter::closeEvent(class QCloseEvent *)" (?closeEvent@GUI_Converter@@MAEXPAVQCloseEvent@@@Z)".
die closeEvent soeht folgendemaßen aus :

Code: Alles auswählen

void GUI_Converter::closeEvent(QCloseEvent *event)
{
	int value = QMessageBox::warning(this, tr("Close"),tr("Are you sure ?"),QMessageBox::Yes,QMessageBox::No);
	if(value == QMessageBox::Yes)
	{
		emit closeAll();
		event->accept();
	}
	else
	{
		event->ignore();
	}
}
wenn also der user die gui schliessen möchte wird closeAll() emittet und in der controller klasse converter sollen alle laufenden routinen unterbrochen werden und alles sauber verlassen werden. einen gleichwertigen funktionsaufrif kann ich nicht machen, da die gui klasse die converterklasse nicht kennt. wie muss ich bei dieser problemstellung am besten vorgehen ?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Du hast das Q_OBJECT in der Klassendefinition vergessen. Danach aber bitte auch noch den Header unter HEADERS in der .pro eintragen.

BTW: Du kannst nicht davon ausgehen, dass das Fenster-Objekt tot ist, nachdem closeEvent() durch ist. Bei gesetztem Qt::WA_DeleteOnClose ja (wenn du das CloseEvent accept()ierst). Ansonsten solltest du das in den Destruktor packen. Vor allem wenn das Objekt noch in einer anderen Klasse liegt (auch Gui, MainWindow evtl?), würde ich es nicht übers closeEvent machen. Wenn sich eh die andere Klasse (Controller), die dann das Signal abfangen soll, um das schließen der laufenden Routinen kümmern soll, mach das doch direkt in deren Destruktor. Ohne SIGNAL/SLOT. Und schau dass dein Controller auch wirklich zerstört wird. Die MessageBox sollte natürlich im closeEvent() bleiben, bei Accepted machst du ein qApp->quit().
Antworten