This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
id_qml_module_dev [2018/01/20 17:34] 178.0.146.219 Hi |
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 Visualisierungs- oder 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 Sprachen, das 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 werden, z.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 | ||
| + | Module in der main.qml können unterschiedliche Modulkonfigurationen, also verschiedene Toolversionen, | ||
| + | erzeugt werden; und so wird ein kundenspezifisches Pricing ermöglicht. | ||
| ---- | ---- | ||
| Line 138: | 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ückgibt, das 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) { | ||