Seite 1 von 1

closeEvent einer GUI mit Controller verknüpfen

Verfasst: 26. Juni 2010 04:32
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 ?

Verfasst: 26. Juni 2010 07:34
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().