2010-04-25 14 views
5

Estoy haciendo un programa basado en tareas que necesita tener complementos. Las tareas deben tener propiedades que puedan editarse fácilmente, creo que esto se puede hacer con las capacidades de reflexión del compilador meta-objeto de Qt (podría estar equivocado, pero debería poder incluir esto en un QtPropertyBrowser?)Intentando hacer un sistema de complemento en C++/Qt

Así que aquí está 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); 
} 

a continuación, un plugin puede tener esta tarea:

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 
} 

En pocas palabras, esto es lo que quiero hacer:

// 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 

Es importante que un .dll tenga varias tareas, porque quiero que estén asociadas por su módulo. Por ejemplo, "FileTasks.dll" podría tener tareas para eliminar archivos, crear archivos, etc.

El único problema con la configuración del plugin de Qt es que quiero almacenar X cantidad de tareas en un módulo .dll. Por lo que puedo decir, solo puedes cargar una interfaz por complemento (¿podría estar equivocado?). Si es así, la única manera posible de lograr lo que quiero es crear FactoryInterface con claves basadas en cadenas que devuelvan los objetos (como en el ejemplo de Plug and Paint de Qt), que es una repetición terrible que me gustaría evitar.

¿Alguien conoce una arquitectura de plugins C++ más limpia que Qt para hacer lo que quiero?

Además, ¿estoy segura asumiendo capacidades de reflexión de Qt hará lo que yo quiero (es decir, capaces de editar las propiedades de un desconocido tareas de carga dinámica con el QtPropertyBrowser antes de enviar)?

Respuesta

6

Parece que has estado pensando detenidamente en esto, que es genial y necesario. No puedo comentar sobre los detalles de Qt, pero asegúrese de que no se pierda en estos consejos plugin, particularmente de versiones: Plugin Architecture

+0

Gran lectura y una solución de marco de ejemplo para arrancar. Básicamente, dice que solo necesita un sistema Factory más inteligente para evitar la repetición que las teclas de cadena le dan, supongo que estaba pensando demasiado en el problema. Esto probablemente resolverá mis problemas si puedo integrarlo. Gracias. –

4

algún motivo usted está evitando de Qt integrado plugin framework?

Ejemplo here.

Edit: Lo siento me perdí la

Por lo que yo puedo decir, sólo se puede cargar una interfaz plug-in por

antes. El ejemplo plug-and-paint muestra que puede implementar muchas interfaces en un complemento. Y estoy confundido acerca de la fábrica de cuerdas de la que está hablando, el ejemplo usa QObjects, slots y señales después de cargar los complementos. Las cadenas solo se usan para mostrar el nombre del complemento en el menú de ayuda.

+0

Me refiero a una forma de cargar fácilmente muchas clases que heredan una interfaz en un complemento. Tal vez estoy confundido, pero parece que solo puedes cargar uno de cada tipo de interfaz. Tengo que usar una solución alternativa, creo. –

+0

Quizás también estoy confundido, ¿quieres tener múltiples plugins cargados desde un dll?Primero, ¿por qué otra cosa que menos archivos? En segundo lugar, creo que si ese es el caso, entonces sí, tienes razón. Cada dll es solo un complemento, pero cada complemento puede implementar múltiples interfaces. Si la única razón por la que desea una única dll es por menos archivos, le recomiendo encarecidamente lo contrario. Las unidades de compilación más pequeñas conducen a tiempos de recompilación más rápidos y pruebas más fáciles. –

+0

Un archivo DLL por complemento hace las cosas mucho más simples para el desarrollador y el usuario. Totalmente de acuerdo con Adam. –

Cuestiones relacionadas