Meldung von Membervariable an Objekt: Signal-Slot-Konzept?

Alles rund um die Programmierung mit Qt
Antworten
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

Meldung von Membervariable an Objekt: Signal-Slot-Konzept?

Beitrag von qmaddin »

Hallo,

ich habe eine von QMainWindow abgeleitete Klasse MainWindow, welche eine Membervariable vom Typ *UsbDevice hat.
Die Klasse UsbDevice implementiert einen usb-Treiber mit der libusb.
Im Konstruktor der Klasse MainWindow wird ein Objekt von der Klasse UsbDevice erzeugt, hierbei wird der Konstruktor aufgerufen, in welchem die Initialisierung des USB-Geräts erfolgt.
Bei der Initialsieriung des Usb-Geräts können allerdings Fehler auftreten, welche ich gerne als Infobox von MainWindow anzeigen lassen würde. Also muss ich ja irgendwie die Fehlermeldung aus dem Konstruktor (oder allgemeiner: aus einer Memberfunktion von UsbDevice) an MainWindow geben.

Hierbei dachte ich an das Signal-Slot-Konzept von Qt. UsbDevice bekommt das Signal error(QString message), MainWindow bekommt den Slot error(QString message).

Da taucht aber das Problem auf, dass ich nicht weiß, wann bzw. wo ich das connect machen muss.

Ich dachte, dass ich das connect im Konstruktor von MainWindow machen muss, also:

Code: Alles auswählen

MainWindow::MainWindow() {
	pUsbDev = new UsbDevice();
	connect(pUsbDev, error(), this, error());
}
Aber dabei würden ja Fehler, die im Konstruktor von UsbDevice auftreten, nicht beachtet werden.

Würde ich die beiden Zeilen vertauschen, bekäme ich ein SegFault, weil das Objekt ja noch nicht existiert.

Ist es also die einzige Möglichkeit, die Initialisierung des Usb-Geräts aus dem UsbDevice-Konstruktor zu entfernen und dann folgendes zu machen?

Code: Alles auswählen

MainWindow::MainWindow() {
	pUsbDev = new UsbDevice();
	connect(pUsbDev, error(), this, error());
	pUsbDev->initUsb(); // Eigentliche Geräteinitialisierung
}
Oder kann ich das connect auch im Konstruktor von UsbDevice aufrufen? Wie greife ich dann dort auf MainWindow zu?

Danke schon mal für Eure Kommentare,
QMaddin
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Einfach nicht im ctor initialisieren sondern eine eigene init() - Funktion. Ggf. noch eine lastError() - Funktion so dass man kein Signal/Slot braucht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten