Sto creando un programma basato su attività che deve avere plugin. Le attività devono avere proprietà che possono essere facilmente modificate, penso che questo può essere fatto con le capacità di riflessione del Meta-Object Compiler di Qt (potrei sbagliarmi, ma dovrei essere in grado di farlo in un QtPropertyBrowser?)Provare a creare un sistema di plugin in C++/Qt
Quindi ecco la base:
class Task : public QObject
{
Q_OBJECT
public:
explicit Task(QObject *parent = 0) : QObject(parent){}
virtual void run() = 0;
signals:
void taskFinished(bool success = true);
}
Poi un plugin potrebbe avere questo compito:
class PrinterTask : public Task
{
Q_OBJECT
public:
explicit PrinterTask(QObject *parent = 0) : Task(parent) {}
void run()
{
Printer::getInstance()->Print(this->getData()); // fictional
emit taskFinished(true);
}
inline const QString &getData() const;
inline void setData(QString data);
Q_PROPERTY(QString data READ getData WRITE setData) // for reflection
}
In poche parole, ecco cosa voglio fare:
// load plugin
// find all the Tasks interface implementations in it
// have user able to choose a Task and edit its specific Q_PROPERTY's
// run the TASK
È importante che una .dll abbia più attività, perché voglio che siano associate al loro modulo. Ad esempio, "FileTasks.dll" potrebbe avere compiti per l'eliminazione di file, la creazione di file, ecc.
L'unico problema con l'installazione di plugin di Qt è la memorizzazione di X quantità di attività in un modulo .dll. Per quanto ne so, puoi caricare solo un'interfaccia per plugin (potrei sbagliarmi?). Se è così, l'unico modo possibile per realizzare ciò che voglio è creare una FactoryInterface con chiavi basate su stringhe che restituiscano gli oggetti (come nell'esempio di Plug-and-Paint di Qt), che è una caldaia terribile che vorrei evitare.
Qualcuno conosce un'architettura di plugin C++ più pulita di quella di Qt per fare ciò che voglio?
Inoltre, sono io in modo sicuro assumendo le capacità di riflessione di Qt farà quello che voglio (vale a dire in grado di modificare le proprietà uno sconosciuto compiti caricate dinamicamente con il QtPropertyBrowser prima della spedizione)?
Ottima lettura e una soluzione di esempio per l'avvio. Fondamentalmente dice che hai solo bisogno di un sistema Factory più intelligente per evitare il boilerplate che ti danno i tasti di stringa, suppongo che stavo pensando troppo al problema. Questo probabilmente risolverà i miei problemi se riesco a integrarlo. Grazie. –