2016-07-25 21 views
1

Ich verwende QML zum ersten Mal und habe eine harte Zeit, um meinen Code zwischen der Kontrolle und den Business-Schichten organisiert zu bekommen.QML-Steuerelement und Business-Schichten

In einem sehr bodenständig Art und Weise, sind alle meine Ereignisse sollen ++ Steuerschicht auf eine C gesendet werden (eine C++ Klasse MyController, die von QObject erbt genannt). Jetzt MyController soll über die Business-Schicht wissen (sagen, es ist eine C++ - Klasse namens MyBusiness) und rufen Sie die entsprechenden Methoden.

Mein MyBusiness ist eigentlich eine komplexe Ansammlung von niedrigeren Niveau Klassen, die ich zusammen in main.cpp setzen.

Früher war ich mit QtWidget und ich konnte MyBusiness über diese komplexe Aggregation oben schaffen MyController erwähnt schaffen und MyBusiness zu MyController es schaffen, seine Arbeit zu tun.

nun wegen QML der Arbeitsweise, MyController tatsächlich auf QML (via QML Registrierung) ausgesetzt ist und MyController Q_INVOKABLE Funktionen werden von QML genannt und sollte wiederum Aufruf MyBusiness Funktionen.

Aber MyController nun tatsächlich in QML geschaffen, so bin ich nicht mehr in der Lage MyController wissen zu lassen MyBusiness.

Was ist die beste Praxis in meinem Fall?

+1

Betrachten Sie auch ein C++ - Singleton als QML-Singleton zu publizieren und dann explizit in QML zu verbinden: 'MyController {business: MyBusiness; } '. – Velkan

+0

Guter Punkt, danke! – arennuit

Antwort

1

ich wie folgt aus:

import QtQuick 2.5 

Item { 
    MyController { 
     business: businessObj 
    } 

    MyBusiness { 
     id: businessObj 
    } 
} 

In MyController.h:

class MyController 
{ 
    Q_OBJECT 
    Q_PROPERTY(MyBusiness* business MEMBER m_business); 
    ... 
    MyBusiness *m_business; 
+0

Das ist eine interessante Idee, danke. – arennuit

0

Hier sind die Lösungen, die ich gedacht haben:

  1. I MyBusiness innerhalb MyController schaffen könnte aber das wäre ein bisschen schmutzig sein (wie die Geschäftsverantwortung nicht in der Steuerung Händen sein soll)
  2. ich auch eine dritte MyApplication Klasse schaffen könnte, die nur den Zweck MyController und MyBusiness aber dann jedes Mal, wenn ich zu verbinden wäre Erstellen Sie eine neue Q_INVOKABLE-Funktion Ich müsste die Funktion in MyApplication erstellen (um aufgerufen werden) und übergeben Sie es an MyController (für den Anruf MyBusiness.Es ist nicht, dass ich bin faul, aber diese Redundanz würde eine Wartungsaufwand
  3. hinzufügt Ich könnte einen Singleton von MyBusiness machen und nenne es von MyController
  4. I @ Velkan Ansatz nutzen könnte (siehe oben)

Ich habe mich für Lösung 3 entschieden (wie es besser zu meinem Anwendungsfall passt), aber Lösung 4 (von @Vulkan) ist auch in einigen Anwendungsfällen wertvoll. Lösung 1 und 2 sind weniger wertvoll.