User Tools

Site Tools


id_qml_module_dev

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
id_qml_module_dev [2018/01/20 17:36]
178.0.146.219
id_qml_module_dev [2018/02/07 02:56] (current)
92.78.28.39
Line 2: Line 2:
  
 Unser Tool ist frontendseitig modular aufgebaut (verschiedene Viewer). Unser Tool ist frontendseitig modular aufgebaut (verschiedene Viewer).
-Jedes Modul löst ein Visualisierungs oder Analyseproblem +Jedes Modul löst ein Visualisierungsoder Analyseproblem 
-odr ermöglicht die Bearbeitung von Datenmanipulationen etc.+oder ermöglicht die Bearbeitung von Datenmanipulationen etc.
 Solche Module sind beispielsweise der "​TableViewer",​ der "​PlotViewer",​ etc. Solche Module sind beispielsweise der "​TableViewer",​ der "​PlotViewer",​ etc.
 Dadurch ist es möglich unterschiedliche Modulkombinationen dem Kunden anbieten zu können. Dadurch ist es möglich unterschiedliche Modulkombinationen dem Kunden anbieten zu können.
 +
 +    Hinweis2: Ein beispielhaftes Modul ist mit "​ModuleExamplicTemplate"​ im Source zu finden. Es dient als
 +    Vorlage um sich zu orientieren,​ wenn man eigene Module entwickeln möchte.
  
 Die Module werden QML seitig (also seitig der UI) über eine jeweils seperate QML je Modul gepflegt und Die Module werden QML seitig (also seitig der UI) über eine jeweils seperate QML je Modul gepflegt und
Line 21: Line 24:
 **Beteiligte Klassen und QML-Files** **Beteiligte Klassen und QML-Files**
  
-Um dieses Modul Konzept zu ermöglichen,​ bedarf es einem deizitierten Zusammenspiel ​aus C++ Klassen und +Um dieses Modul Konzept zu ermöglichen,​ bedarf es eines dedizierten Zusammenspiels ​aus C++ Klassen und 
-QML-Dateien,​ welche folgend erläutert werden. Nehmen wir dafür an, wir möchten ein Module ​<​module>​ erstellen+QML-Dateien,​ welche folgend erläutert werden. Nehmen wir dafür an, wir möchten ein Modul <​module>​ erstellen
 und dem Tool hinzufügen. Da Klassen immer auch header Dateien benötigen, lasse ich in der Beschreibung im und dem Tool hinzufügen. Da Klassen immer auch header Dateien benötigen, lasse ich in der Beschreibung im
 Folgenden header Dateien einfach weg, da es klar ist, das diese auch zu implementieren sind. Beteiligte Klassen Folgenden header Dateien einfach weg, da es klar ist, das diese auch zu implementieren sind. Beteiligte Klassen
Line 44: Line 47:
  
 Die Klassen/QML welche <​module>​ beinhalten, sind neu zu erstellen und implementieren die Funktionalität unseres Modules. Die Klassen/QML welche <​module>​ beinhalten, sind neu zu erstellen und implementieren die Funktionalität unseres Modules.
-Alle anderen genannten ​Daten sind bereits vorhanden, und von diesen wird im Weiteren entweder einfach abgeleitet,+Alle anderen genannten ​beteiligten Dateien ​sind bereits vorhanden, und von diesen wird im Weiteren entweder einfach abgeleitet,
 oder es gibt notwendige Anpassungen in diesen Dateien, wie folgt detailiert erläutert oder es gibt notwendige Anpassungen in diesen Dateien, wie folgt detailiert erläutert
  
Line 50: Line 53:
  
 ---- ----
-**Detailierte Beschreibung des Zusammenspiels zuvor genannter ​Daten um ein neues Modul dem Tool hinzuzufügen**+**Detailierte Beschreibung des Zusammenspiels zuvor genannter ​Dateien, ​um ein neues Modul dem Tool hinzuzufügen**
  
  
  
-  ​* IsModule.cpp ist ein abstraktes Interface von welchem abgeleitet wird um ein Modul als solches zu kennzeichnen.+* IsModule.cpp ist ein abstraktes Interface von welchem abgeleitet wird um ein Modul als solches zu kennzeichnen.
  
   Es enthält die Methode "​updateModule()",​ welche jedes Modul das von IsModule abgeleitet wird, zu   Es enthält die Methode "​updateModule()",​ welche jedes Modul das von IsModule abgeleitet wird, zu
Line 61: Line 64:
    
  
-  * ContainerUI.cpp ist eine Klasse welche verwendet wird um alle Module zu managen, und zu verwalten (auch die internationalisierung ​der Sprachen ​und das Laden von Daten ist hier implmentiert.)+  * ContainerUI.cpp ist eine Klasse welche verwendet wird um alle Module zu managen, und zu verwalten (auch die Internationalisierung ​der Sprachendas Laden von Daten, und die Lizenzverwaltung ​ist hier implementiert.)
  
  
Line 70: Line 73:
        
        
-  ​* <​module>​.cpp implementiert das neue Modul, beispielsweise als QQuickPaintedItem oder Ähnliches.+* <​module>​.cpp implementiert das neue Modul, beispielsweise als QQuickPaintedItem oder Ähnliches.
   ​   ​
   ​   ​
Line 77: Line 80:
   registrieren durch den aufruf von "​ContainerUI::​registryModule(this)"​. Dadurch wird das Modul in der   registrieren durch den aufruf von "​ContainerUI::​registryModule(this)"​. Dadurch wird das Modul in der
   Modulliste von ContainerUI per Zeiger hinterlegt. Zudem muss das Modul im Konstructor noch benannt werden,   Modulliste von ContainerUI per Zeiger hinterlegt. Zudem muss das Modul im Konstructor noch benannt werden,
-  durch this->​mStringTypeName="​Module Viewer >";​. ​ Nun ist noch die geerbte ​Mehtode ​"​updateModule()"​ +  durch this->​mStringTypeName="​Module Viewer >";​. ​ Nun ist noch die geerbte ​Methode ​"​updateModule()"​ 
-  zu implementieren.+  zu implementieren. Sie wird aktuell immer dann für jedes Modul aufgerufen, wenn ein Datensatz geladen wird, 
 +  um entsprechende Initialisierung der Modules mit den neuen Daten "on demand"​ zu ermöglichen
   ​   ​
 +  {OffTopic: Wie dem auch sei, die "​updateModule()"​ Methode aller (!) Module kann seitens aus QML bei Bedarf
 +  immer mit  "​containerUI.updateAllModules();"​ ausgelöst werden. Aber bitte beachten: Das ist eine globale
 +   ​Operation auf alle Module, und man muss schon genau schauen welche unerwünschten Effekte bei den anderen
 +   ​Modulen dadurch eventuell auftreten können.}
   ​   ​
-  ​* GuiState.cpp verwaltet den Zustand des Tools. ​+* GuiState.cpp verwaltet den Zustand des Tools. ​
  
  
Line 89: Line 97:
        
        
-  ​* QML_For_<​module>​.qml ist als neue qml für das neue Modul anzulegen, dort wo auch die main.qml liegt.+* QML_For_<​module>​.qml ist als neue qml für das neue Modul anzulegen, dort wo auch die main.qml liegt.
  
-  In dieser QML werden alle relevanten UI Funktionen implementiert. Nach dem initialen "​Item{"​ oder ähnliches+  In dieser QML werden alle relevanten UI Funktionen implementiert. ​das neue Modul wird in seiner 
 +  QML bekannt gemacht durch "​import mpv.<​module>​ 1.0"​. 
 +   
 +  ​Nach dem initialen "​Item{"​ oder ähnliches
   ist zwingend das folgende in die qml zu schreiben:   ist zwingend das folgende in die qml zu schreiben:
   ​   ​
    ​property int thisIntQML_Modules_Visible_Variable : 0    ​property int thisIntQML_Modules_Visible_Variable : 0
    ​property int thisIntQML_Module_Index_Variable : -1    ​property int thisIntQML_Module_Index_Variable : -1
 +   ​property int just_a_VariableForImplementationReasons:​ 0
 +   
 +   
         Connections {         Connections {
             target: appWindow             target: appWindow
Line 106: Line 120:
         }          } 
  
-   ​Dadurch wird das Modul mit dem Reiter-Button ​system ​verbunden, welches einen button ​erzeugt um das Modul+   ​Dadurch wird das Modul mit dem Reiter-Button ​System ​verbunden, welches einen Button ​erzeugt um das Modul
    ​sichtbar werden zu lassen im Tool.    ​sichtbar werden zu lassen im Tool.
-   Zudem muss das modul min einmal in seiner qml instanziiert werden ​ z.B. durch "<​module>​{}"​ damit einmal der+   Zudem muss das Modul min einmal in seiner qml instanziiert werdenz.B. durch "<​module>​{}"​ damit einmal der
    ​Konstruktor aufgerufen wird und das Modul so registriert ist.    ​Konstruktor aufgerufen wird und das Modul so registriert ist.
  
-  ​* qml.rc führt alle Resourcen des tools auf. Hier muss die qml-Datei des Moduls hinzugefügt werden damit +* qml.rc führt alle Resourcen des tools auf. Hier muss die qml-Datei des Moduls hinzugefügt werden damit  
-    sie im weiteren dem Tool zur nutzung ​bekannt ist, durch hinzufügen von:  <​file><​module>​.qml</​file>​+    sie im weiteren dem Tool zur Nutzung ​bekannt ist, durch hinzufügen von:  <​file><​module>​.qml</​file>​
  
  
-  ​* main.qml ​ertsellt ​alle Module, so das sie zur Laufzeit nutzbar sind. Hier ist hinzuzufügen:​+* main.qml ​erstellt ​alle Module, so dass sie zur Laufzeit nutzbar sind. Hier ist hinzuzufügen:​
     ​     ​
     QML_For_Module_<​module>​{     QML_For_Module_<​module>​{
         id: qmlModule<​module>​Viewer         id: qmlModule<​module>​Viewer
 +        objectName: "​qmlModule<​module>​ViewerObject"​
         z: 200         z: 200
         visible: false;         visible: false;
         thisIntQML_Modules_Visible_Variable : intQML_Modules_Visible_Variable         thisIntQML_Modules_Visible_Variable : intQML_Modules_Visible_Variable
         thisIntQML_Module_Index_Variable : containerUI.getModuleIndex("​Module Viewer >"​);​         thisIntQML_Module_Index_Variable : containerUI.getModuleIndex("​Module Viewer >"​);​
 +        just_a_VariableForImplementationReasons : containerUI.set_QML_ObjectName_String_from_Instance("​qmlModule<​module>​ViewerObject",​
 +        containerUI.getModuleIndex("​Module Viewer >"​));​
 +        ​
     }     }
  
     Dadurch wird das Modul zur Laufzeit erstellt und kann im Tool genutzt werden. Bitte darauf achten das     Dadurch wird das Modul zur Laufzeit erstellt und kann im Tool genutzt werden. Bitte darauf achten das
-    der String "​Module Viewer >" exakt der gleiche ​ist, wie er im Konstructor von <​module>​.cpp bei +    der String "​Module Viewer >" ​(bei '​thisIntQML_Module_Index_Variable'​) ​exakt der Gleiche ​ist, 
-    this->​mStringTypeName ​ genannt wurde (sonst funktioniert es nicht).+    ​wie er im Konstructor von <​module>​.cpp ​von Euch bei 
 +    this->​mStringTypeName genannt wurde (sonst funktioniert es nicht)
 +    Bitte bei '​just_a_VariableForImplementationReasons'​ weiter darauf achten, dass der erste String im Funktionsaufruf 
 +    mit "​qmlModule<​module>​ViewerObject"​ genau die Bezeichnung des '​objectName'​ dieses qml-Modules ist, und auch 
 +    hier der zweite String mit "​Module Viewer >" wieder exakt der Gleiche ist, wie er im Konstructor von <​module>​.cpp 
 +    von Euch bei this->​mStringTypeName genannt wurde. Auch hier: wenn es nicht exakt so ist, funktioniert das 
 +    Modul, dessen Einbindung, ja noch nichteinmal dessen Lizenzierungsprozess innerhalb des Tools leider nicht. 
 +    Also unbedingt auf Genauigkeit und Gründlichkeit achten, and dieser sehr neuralgischen Stelle.
  
-    Nun ist das Modul angemeldet, eingebunden und kann genutzt werden. ​Wennimmer ​Module ​aktuallisert ​werden +    Nun ist das Modul angemeldet, eingebunden und kann genutzt werden. ​Wann immer Module ​aktualisiert ​werden 
-    müssen, kann an jeder beliebigen ​stelle ​im qml einfach "​containerUI.updateAllModules();"​ aufgerufen werden,+    müssen, kann an jeder beliebigen ​Stelle ​im qml einfach "​containerUI.updateAllModules();"​ aufgerufen werden,
     wodurch für jedes registrierte Modul seine jeweils eigene "​updateModule()"​ Methode aufgerufen wird.     wodurch für jedes registrierte Modul seine jeweils eigene "​updateModule()"​ Methode aufgerufen wird.
     ​     ​
-    Hier erschließt sich auch der sinn des Modulkonzeptes:​ durch einfaches ein und auskommentieren der+    Hier erschließt sich auch der Sinn des Modulkonzeptes:​ durch einfaches ein und auskommentieren der
     Module in der main.qml können unterschiedliche Modulkonfigurationen,​ also verschiedene Toolversionen,​     Module in der main.qml können unterschiedliche Modulkonfigurationen,​ also verschiedene Toolversionen,​
     erzeugt werden; und so wird ein kundenspezifisches Pricing ermöglicht. ​     erzeugt werden; und so wird ein kundenspezifisches Pricing ermöglicht. ​
Line 142: Line 167:
  
     Hinweis: Hin und wieder kann es notwendig sein von qml Objkten bestimmte Eigenschaften aud dem c++ code selbst     Hinweis: Hin und wieder kann es notwendig sein von qml Objkten bestimmte Eigenschaften aud dem c++ code selbst
-    heraus zu setzen, anstatt über die qml Files selbser. Dafür gib es GuiState die Klassenfunktion +    heraus zu setzen, anstatt über die qml Files selber. Dafür gib es in GuiState die Klassenfunktion 
-    "​Object ​Object= static QObject * m_getQMLObjectAsQObject(QString QML_Object_String);"​ welche das +    "​Object ​QML_Object= static QObject * m_getQMLObjectAsQObject(QString QML_Object_String);"​ welche das 
-    QObject aus dem qml zurückgibtdas als Objektname '​objectName:​ "​QML_Object_String"​ ' besitzt. +    QObject aus dem qml zurückgibt das als Objektname '​objectName:​ "​QML_Object_String"​ ' besitzt. 
-    Die Eigenschaften können dann leicht wie folgt gesetzt werden:+    Die Eigenschaften können dann leicht ​- beispielsweise ​wie folgt gesetzt werden:
     ​     ​
     if(QML_Object) {     if(QML_Object) {
id_qml_module_dev.1516466191.txt.gz · Last modified: 2018/01/20 17:36 by 178.0.146.219