2010-04-25 16 views
5

Tworzę program zadaniowy, który wymaga wtyczek. Zadania muszą mieć właściwości, które można łatwo edytować, myślę, że można to zrobić za pomocą funkcji refleksji Kompilatora Metaobiektu Qt (mógłbym się mylić, ale powinienem móc to włożyć w QtPropertyBrowser?)Próba stworzenia systemu wtyczek w C++/Qt

Więc oto podstawa:

class Task : public QObject 
{ 
Q_OBJECT 
public: 
    explicit Task(QObject *parent = 0) : QObject(parent){} 

    virtual void run() = 0; 

signals: 
    void taskFinished(bool success = true); 
} 

Następnie plugin może mieć to zadanie:

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 
} 

W skrócie, oto co chcę zrobić:

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

Ważne jest, aby jeden .dll miał wiele zadań, ponieważ chcę, aby były powiązane przez ich moduł. Na przykład "FileTasks.dll" może mieć zadania do usuwania plików, tworzenia plików itp.

Jedynym problemem z konfiguracją wtyczki Qt jest zapisanie X ilości zadań w jednym module .dll. O ile mogę powiedzieć, możesz załadować tylko jeden interfejs na wtyczkę (mógłbym się mylić?). Jeśli tak, jedynym możliwym sposobem osiągnięcia tego, czego chcę, jest stworzenie FactoryInterface z kluczami opartymi na łańcuchach, które zwracają obiekty (jak w przykładzie Qt Plug-And-Paint), co jest okropnym szablonem, którego chciałbym uniknąć.

Ktoś zna czystszą architekturę wtyczki C++ niż Qt, aby robić to, co chcę?

Również ja bezpiecznie zakładając możliwości odbicia Qt będzie robić to, co chcę (to znaczy w stanie edytować właściwości nieznanego załadowane dynamicznie Zadania z QtPropertyBrowser przed wysyłką)?

Odpowiedz

6

Wygląda na to, że podałeś tę dokładną myśl, która jest wspaniała i potrzebna. Nie mogę wypowiedzieć się na temat specyfiki Qt, ale pamiętaj, aby nie przegapić tych rad wtyczki, szczególnie wersjonowania: Plugin Architecture

+0

Świetna lektura i przykładowe rozwiązanie do uruchamiania systemu. Zasadniczo mówi, że potrzebujesz mądrzejszego systemu Factory, aby uniknąć zestawu znaków, który dają ci klucze strunowe, przypuszczam, że nadmiernie myślałem o problemie. To prawdopodobnie rozwiąże moje problemy, jeśli będę mógł je zintegrować. Dzięki. –

4

jakiegoś powodu unika Qt wbudowanej plugin framework?

Przykład here.

Edit: Niestety brakowało mi

O ile mogę powiedzieć, można załadować tylko jeden interfejs za wtyczki

wcześniej. Przykład plug-and-paint pokazuje, że można zaimplementować wiele interfejsów w jednej wtyczce. I jestem zakłopotany fabryką opartą na ciągach, o której mówisz, w przykładzie używa QObjects, slotów i sygnałów po załadowaniu wtyczek. Łańcuchy są używane tylko do pokazania nazwy wtyczki w menu pomocy.

+0

Mam na myśli sposób na łatwe ładowanie wielu klas, które dziedziczą jeden interfejs w wtyczce. Może jestem zdezorientowany, ale wygląda na to, że możesz załadować tylko jeden z każdego typu interfejsu? Muszę użyć obejścia, które myślę. –

+0

Może i jestem zdezorientowany, chcesz mieć wiele wtyczek załadowanych z jednej biblioteki dll?Po pierwsze, dlaczego inne niż mniej plików? Po drugie, wierzę, że jeśli tak jest, to tak, masz rację. Każda biblioteka dll to tylko jedna wtyczka, ale każda wtyczka może implementować wiele interfejsów. Jeśli jedynym powodem, dla którego chcesz, aby pojedyncza biblioteka DLL zawierała mniej plików, zdecydowanie sugerowałbym, że jest inaczej. Mniejsze jednostki kompilacji prowadzą do szybszych czasów rekompilacji i łatwiejszego testowania. –

+0

Jedna biblioteka DLL na wtyczkę znacznie upraszcza programistom i użytkownikom. Całkowicie zgadzam się z Adamem. –