wenn man signals/slots verwenden möchte, muss bekanntlich von QObject geerbt werden. Leider kann moc aber nicht mit von QObject geerbten template Klassen umgehen. Folgendes geht also z.B. nicht:
Code: Alles auswählen
template <class T>
class Foo : public QObject
{
//...
signals:
void finished(const T *value);
Code: Alles auswählen
signals:
virtual void finished(const BaseClass *value);Code: Alles auswählen
class Adapter : public QObject
{
//...
};Code: Alles auswählen
class Job : public QObject
{
//...
signals:
void finished(Job *job);
};Richtig unschön wird es aber erst jetzt. Eine abgeleitete Klasse eines Adapter könnte so aussehen:
Code: Alles auswählen
class TodoAdapter : public Adapter
{
Q_OBJECT
Q_DISABLE_COPY( TodoAdapter )
public:
//...
virtual TodoListJob* list() = 0;
virtual TodoFetchJob* fetch(const QByteArray &id) = 0;
virtual TodoCreateJob* create(Document::Todo *value) = 0;
virtual TodoUpdateJob* update(Document::Todo *value) = 0;
virtual TodoRemoveJob* remove(Document::Todo *value) = 0;
};Der TodoFetchJob sieht übrigens etwa so aus:
Code: Alles auswählen
class TodoListJob : public Job
{
Q_OBJECT
Q_DISABLE_COPY( TodoListJob )
public:
virtual QList<QSharedPointer<Document::Todo>> result() const = 0;
signals:
void processed(QSharedPointer<Document::Todo> value);
};Ich stolpere hier also gerade über "alle" Probleme von moc: Keine virtuellen Signale, keine Templates, keine Mehrfachvererbung von QObject (hier nicht angesprochen, wurde aber die Implementierung der Jobs deutlich erleichtern).
Wie könnte ich mir diesen Aufwand ersparen, ohne das die API für den Benutzer wesentlich komplizierter wird? Oder ist das Design so grundsätzlich total daneben?
MfG,
Stefan