Seite 1 von 1

[gelöst] Fenster mit Plugin erweitern/modifizieren

Verfasst: 5. April 2010 02:32
von Singesang
Hallo :D

ich schreibe eine Anwendung, welche durch Plugins erweitert werden soll.
  • Dazu kann sich entweder die Anwendung aus dem Plugin die neuen Widgets holen und einfügen, sodass die Anwendung quasi die Kontrolle hat, welche Änderungen gemacht werden dürfen
ODER
  • ich übergebe irgendwie dem Plugin irgendwie n Handler (ich hoffe das ist der richtige Begriff) auf die Hauptanwendung (this->ui ist das in diesem Fall) sodass das Plugin selbst machen kann, was es will.
Ich würde der Sauberkeit wegen eher zur ersten Option tendieren, da man so später Slots für Plugins definieren kann, welche je nach Funktionalität von den einzelnen Plugins belegt werden können (um zu vermeiden, dass z.B. zwei Plugins geladen werden, welche dasselbe Aufgabengebiet abdecken).

Mein Problem ist nun die Umsetzung. Ich habe leider keine Ahnung, wie ich eine der beiden Optionen umsetzen kann, da es in keinem Fall - mangels Ahnung - funktioniert hat. Demnach wäre ich über jeden hilfreichen Tipp erfreut. :)

mfg Singesang

Edit:

tabWidget->addWidget(this) hat geholfen.

Verfasst: 5. April 2010 23:49
von Chris81T
Hallo,

ich denke, dass Plug & Paint Example ist für dich recht interessant. Es macht dir vor, wie du "Plugins" / Libraries verwenden kannst.

Verfasst: 6. April 2010 05:36
von Singesang
Ich habe schon eine funktionstüchtige Anwendung geschrieben, welche mir die Plugins lädt und initialisiert:
Um dem QTabWidget tabWidget etwas hinzuzufügen, gehe ich gerade folgenden Weg: In Zeile 65 in src/base/widget.cpp rufe ich die Funktion initialize(QTabWidget *) auf. Somit übergebe ich dem Plugin quasi einen Handler auf das QTabWidget, sodass das Plugin dann QTabWidget::addTab(...) aufrufen kann. Dies entspricht dem zweiten Weg den ich oben angesprochen habe, welchen ich jedoch nicht beschreiten wollte. (siehe Anhang overcraft.tar.gz). Des weiteren füge ich nicht das Widget aus dem Plugin hinzu, sondern hole mir einen Tab aus dem QTabWidget des Plugins und füge diesen dem QTabWidget der Anwendung hinzu (src/plugins/widgettime/widgettime.h Zeile 31).

Ich glaube ich habe aber die Frage falsch formuliert. Sie sollte eher lauten:

Wie füge ich ein komplettes Widget aus einer .ui-Datei in ein QTabWidget ein? Es geht darum, dass ich die komplette Ui::WidgetTime aus einer anderen .ui-Datei (hier: src/plugins/widgettime/widgettime.ui) als Tab hinzufügen will.

Verfasst: 6. April 2010 11:48
von RHBaum
Bei Plugins solltest du Dir vorher erst mal richtig klar sein, was Du willst.

Hab mir dein Beispiel ned angeguckt, aber scheinbar Exportierst du ueber Deine Pluginschnittstelle QT Klassen ? richtig ?

Dann solltest Du dir aber auch ueber die konsequenzen bewusst sein (QT versions und compile abhaengigkeit).

Weiterhin, welchses level, welche ausbaustufe von Plugins brauchst du ?
- fast-Plugins - einfach das vorhandensein einer Dll schaltet funktionalitaet ein
- vollstaendige Plugins - eine Aufgabe / Funktion kann von mehreren plugins (parrallel installiert) geloest werden, und der user soll auswaehlen welches. ergo du brauchst ne richtige Pluginverwaltung.

Beispiele:

gimp, plugins durch scripte, sind vollwertige plugins z.b.

Mediaplayer, codecs, wo geschaut wird ob zum decodieren eine bestimmte dll vorliegt, sind eher "fast" plugins.

Dementsprechend solltest du deine Pluginschnittstelle hochziehen.

nen fast plugin mit QT schnittstelle, nagelt die App auf die eine dll fest, und du brauchst soweiso kontrolle ueber beide komponenten, da du qt abhaengigkeiten in der Schnittstelle hasst. Das heisst eine erweiterung der App unabhaengig von Dir (also ohne deinem wissen und zustimmung) iss ned möglich. Und bei jeder neuen version musst du App und Plugin neu kompilieren, dafuer sparst dir aber ne Menge PluginOverhead.
WIe gesagt, du solltest Dir nur der konsequenzen bewusst sein!

Ciao ....

Verfasst: 7. April 2010 03:30
von Singesang
Hab mir dein Beispiel ned angeguckt, aber scheinbar Exportierst du ueber Deine Pluginschnittstelle QT Klassen ? richtig ?
Ja, ich vermute dass ich das so gemacht habe :lol: interface hauptanwendung.cpp hauptanwendung.h
Ich habe halt das EchoPluginExample erweitert um ein bisschen zu lernen und habe aus diesem Wissen diese Anwendung geschrieben.

Ich dachte an diese "vollständige Plugins" inklusive der Implementation einer Verwaltung für diese (über ein Backend o.ä.), denn bei meiner Anwendung handelt es sich um eine Oberfläche für einen Boardcomputer, welcher über ein Touchscreen bedient wird. Würdest du mir da zu etwas anderem raten?

Hier ein Screenshot der alten Fassung der Oberfläche:
Bild

Verfasst: 7. April 2010 18:54
von Chris81T
Offtopic:
Laut dem Screenshot wird da ein cooles Lied angestimmt 8) Gibt es eigentlich wieder was neues vom Rob Dougan?

Verfasst: 18. April 2010 15:02
von Singesang
Ich habe es geschafft:
Ich muss tabWidget->addTab(this) aufrufen.
Danke für die Hinweise :D

@Chris81T: Nicht das ich wüsste. Evtl. könnte dir aber auch Overseer gefallen.