[OK]Virtueller Slot in einer abstrakten Klasse ohne QObject?

Alles rund um die Programmierung mit Qt
Antworten
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

[OK]Virtueller Slot in einer abstrakten Klasse ohne QObject?

Beitrag von harry_m »

Wie in der Überschrift bereits beschrieben:

ich habe eine abstrakte Klasse (soll die Schnittstelle machen), in der ich einen virtuellen Slot definierte:

Code: Alles auswählen

virtual void receiveMcData(const QVector<qint32> &data) = 0; 
Wie es sich gehört, wurde die Klasse vom QObject abgeleitet, um eben den Signal/Slot Mechanismus zum Laufen zu bringen.

Dumm nur, dass in der Klasse, die diese abstrakte Klasse verwenden soll QObject bereits vererbt wurde. Wie umgeht man das am besten?

Mein Gedanke war, QObject aus der abstrakten Klasse heraus zu nehmen: in der Hoffnung, dass das vererbte QObject in der abgeleiteten Klasse bei der Reimplementierung wieder greift.

Aber mir fehlt der Überblick: kann das so funktionieren?

P.S.: habe es gerade ausprobiert und musste feststellen, dass es gar nicht geht: denn ohne das QObject kann ja auch "qint32" nicht verwendet werden. Wie macht man in Qt überhaupt so eine abstrakte klasse?
Zuletzt geändert von harry_m am 26. Oktober 2012 21:10, insgesamt 2-mal geändert.
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?

Beitrag von franzf »

qint32 -> #include <QtGlobal>
Ein interface ist üblicherweise nur ein Interface -> QObject-Vererbung rausnehmen.
interface erbt von QObject + Q_OBJECT in der Klassendefinition -> du musst mindestens deine virtuellen Methoden implementieren, sonst gibts trouble vom linker -> dein interface braucht eine eigene .cpp die kompiliert werden muss!
Und du kannst jederzeit in einer abgelieteten Klasse eine (virtuelle) Methode als slot deklarieren. Dann geht halt keine QObject::connect mit nur nem Zwiger auf interface.
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?

Beitrag von harry_m »

Danke für die schnelle Antwort.

"...Dann geht halt keine QObject::connect mit nur nem Zwiger auf interface..."

Könntest du hier bitte etwas mehr ausführen? Ich kann nicht ganz folgen.

Gruß
Harry
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?

Beitrag von franzf »

Code: Alles auswählen

struct interface {
    virtual ~interface() {}
    virtual void action() =0;
};
class concrete_class : public QObject, public interface {
public slots:
    void action() {}
};

///
interface *iface = new concrete_class();
QObject::connect(some_sender, SIGNAL(request()), iface, SLOT(action())); // ERROR!
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?

Beitrag von harry_m »

Hm...

Aber genau das habe ich vor: die Objekte dieser Klasse sollen beim Parsen einer XML-Konfigurationsdatei angelegt und mit entsprechenden Parametern "bestückt" werden...

Wie mache ich es denn dann?
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?

Beitrag von franzf »

Du willst beim Parsen einer XML-Datei über SIGNAL/SLOT gehen? Würde ich definitiv nicht, alleine wegen der Performance.
Warum muss es denn ein vollkommen eigener Parser sein? Reicht dir QXmlReader nicht?
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?

Beitrag von harry_m »

Habe mich wohl falsch ausgedrückt.

In der XML-Datei wird eine Konfiguration hinterlegt. Diese XML Datei wird beim Starten der Applikation einmalig gelesen. Dabei werden die Eigenschaften der Elemente, die angezeigt werden sollen herausgeholt. Dazu gehören außer den geometrischen Daten auch die Kommunikationsverbindungen. Und diese sollen über diese Signal-Slot Verbindungen eingerichtet werden.

Sprich:

1. Konfiguration der Einheit lesen.
2. Diese Einheit anlegen.
3. Die Einheit mit der Datenquelle verbinden (und hier kommen die Signal-Slot Verbindungen zum Einsatz)

Habe es mit einfacheren Klassen bereits ausprobiert: funktioniert bestens. An einer anderen Stelle (es war die Simulation der Datenquelle) habe ich jeden "Kanal" samt Signal/Slot Verbindung sogar in einen eigenen Thread verschoben. War schwer beeindruckt, wie einfach das war (nachdem ich herausgefunden habe, wie es RICHTIG gemacht wird, sprich mit "QObject::moveToThread()").

Daher war ich der Meinung, dass es auch hier gehen muss.

P.S.: übrigens, es geht darum:

http://www.qtforum.de/forum/viewtopic.p ... 7&start=30
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?

Beitrag von harry_m »

Ich habe die Aufgabe gelöst.

Dafür wie vom Franz empfohlen, in der Abstrakten Klasse eine virtuelle "public"-Methode angelegt:

Code: Alles auswählen

virtual void receiveMcData(const QVector<qint32> &data) =0;
Erst in der abgeleiteten Klasse wurde diese Methode als Slot reimplementiert.

Danke an Franz.

Gruß
Harry.
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
Antworten