2010-04-25 21 views
5

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)?

risposta

6

Sembra che tu abbia dato una riflessione approfondita, che è eccezionale e necessaria. Non posso commentare sulle specifiche Qt, ma essere sicuri di non perdere su questi pezzi di consulenza plug-in, in particolare delle versioni : Plugin Architecture

+0

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. –

4

Qual è il motivo si sta evitando di Qt built-in plugin framework?

Esempio here.

Edit: Scusa ho perso il

Per quanto posso dire, si può solo caricare una sola interfaccia per plug

prima. L'esempio plug-and-paint mostra che è possibile implementare molte interfacce in un plug-in. E sono confuso riguardo alla fabbrica basata su stringhe di cui stai parlando, l'esempio usa QObjects, slot e segnali dopo aver caricato i plugin. Le stringhe sono usate per mostrare il nome del plugin nel menu di aiuto.

+0

Intendo un modo per caricare facilmente molte classi che ereditano un'interfaccia in un plug-in. Forse sono confuso, ma sembra che tu possa caricare solo uno di ogni tipo di interfaccia? Devo usare una soluzione, penso. –

+0

Forse sono anche confuso, vuoi avere più plugin caricati da una dll?Innanzitutto, perché oltre a meno file? Secondo, credo che se è così allora sì, hai ragione. Ogni dll è solo un plugin, ma ogni plugin può implementare più interfacce. Se l'unica ragione per cui vuoi una singola dll è per meno file, ti suggerirei vivamente il contrario. Le unità di compilazione più piccole consentono tempi di ricompilazione più rapidi e test più semplici. –

+0

Una DLL per plugin rende le cose molto più semplici per sviluppatore e utente. Totalmente d'accordo con Adam. –

Problemi correlati