Seite 1 von 1
[OK]Virtueller Slot in einer abstrakten Klasse ohne QObject?
Verfasst: 18. Oktober 2012 08:20
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?
Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?
Verfasst: 18. Oktober 2012 09:16
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.
Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?
Verfasst: 18. Oktober 2012 09:40
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
Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?
Verfasst: 18. Oktober 2012 10:00
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!
Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?
Verfasst: 18. Oktober 2012 10:30
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?
Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?
Verfasst: 18. Oktober 2012 12:46
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?
Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?
Verfasst: 18. Oktober 2012 14:10
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
Re: Virtueller Slot in einer abstrakten Klasse ohne QObject?
Verfasst: 22. Oktober 2012 17:28
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.