PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tutorial für Plugins unter QT?



TheDodger
17-07-2002, 15:54
Gibt es ein tutorial für eine Plugin-Schnittstelle, die ich unter QT nutzen kann?
@anda_skoa leider kein KDE :D
Es muß unter QT laufen ...

Ich muß irgendwie hier etwas hinbekommen, was ungefähr so funktionieren soll:
In einem (statischem?) Verzeichniss liegen einzelene Textdateien mit einem statischem Aufbau.
Anhand der Anzhl der Dateien muß ich in einem MDI eine ToolBar einrichten und darüber die einzelnen MDIChilds erzeugen.
Innerhalb der MDIChild soll nur eine QDataTable erzeugt werden, deren Definition (Anzahl der Spalten, Überschrift, Breite) in den einzelnen Textdateien steht.
Kompliziert? ;) ja, weiß ich.

Die Klasse für die QDataTable habe ich schon ... jetzt muß ich den Kram nur noch so hinbekommen, das ich ein Verzeichniss scannen kann, und anhand der vorliegenden Dateien ein dynamisches ToolBar erzeugen und mit entsprechenden connect / signals / slots versehen kann.

anda_skoa
17-07-2002, 16:57
Hi!


@anda_skoa leider kein KDE

Mist ;)

QDataTable kenn ich nicht, aber wobei brauchst du da Plugins?
Müssen da Widgets dargestellt werden, die in externen Bibliotheken definiert sind und zur Laufzeit geladen werden?

Ciao,
_

TheDodger
17-07-2002, 17:08
Original geschrieben von anda_skoa
Hi!
Mist ;)

Ich wusste es! :D



QDataTable kenn ich nicht, aber wobei brauchst du da Plugins?
Müssen da Widgets dargestellt werden, die in externen Bibliotheken definiert sind und zur Laufzeit geladen werden?

So ungefähr ...
letztendlich soll etwas dabei herauskommen, um daten in der DB zu pflegen, ohne viel programmieren zu müssen.
wenn es so laufen würde, ich ich mir dachte, dann könnte man quasi nur eine neue definitionsdatei erstellen (einfaches ASCII-format) und beim neustart des programmes würde der rest intern geregelt werden.

so als hintergrund:
wir haben hier eine oracle und für die daten ein duzend frontends entworfen.
jetzt müssen die daten innerhalb der DB von einem admin entsprechend gepflegt werden.
da allerding gut 50 tabellen innerhald der DB 'rumwuseln' wollen wir nicht für jede tabelle ein eigenständiges widget programmieren. dauert zu lange und ist zu aufwendig, auch wenn der großteil aus c'n'p bestehen würde.

ich bin schon soweit, das ich einfach eine von QDataTable abgelittene Klasse erzeugen brauche, die eben so eine ascii-datei nachlädt, wo dann schon drinsteht, welche tabelle angezeigt werden soll.
war nicht einfach, funktioniert aber :)

jetzt nur noch ein handler, der mir dynamisch qactions samt den kram dahiner verwaltet ...

anda_skoa
17-07-2002, 17:23
Entschuldige das ich nachfragen, aber ich verstehe das so, dass es immer das selbe Widget ist, das nur anderes aussieht.

Plugins sind ja nur nötig, wenn man dynamisch Bibliotheken linken will.

Ciao,
_

TheDodger
17-07-2002, 17:51
Original geschrieben von anda_skoa
Entschuldige das ich nachfragen, aber ich verstehe das so, dass es immer das selbe Widget ist, das nur anderes aussieht.

das ist abhängig von der jeweiligen tabelle ... mal ja, mal nein, aber zu 80% ja.

ich könnte natürlich auch auf die toolbar verzichten und ein listview nehmen ... grübel

anda_skoa
17-07-2002, 18:06
Du kannst ja den Toolbar dynamisch mit Widgets füllen, aber du brauchst noch lange keine Plugins :)

Deine Childwindows sind zwar für die Applikation vom Verhalten her wie Plugins, weil
sie sich je nach config anders verhalten, aber du mußt sie nicht dynamisch laden.

Dieses runtime loading macht es kompliziert, vorallem wenn es auf allen Platfformen laufen soll.

Aber ich kenne natürlich deine Anforderungen nicht und mit Datenbanken kenn ich mich auch nciht so aus :)

Ciao,
_

anda_skoa
17-07-2002, 19:12
Hi Dodger!

Mir ist eine Kompromisslösung eingefallen :)

"plugins" ohne dynamic loading :)

Kurz umrissen:
Alle diese Data Widgets kommen ein eine Bibliothek, die eine shared lib ist, also beim Starten des Progrs geladen wird.
Dann kann man diese Lib tauchen/upgraden wenn man neue widgets hat, aber man muß nicht zur Laufzeit laden.

Sonst macht man es wie bei Plugins:
- man erstellt eine Basisklasse, die das Interface festlegt.
- man macht einen loader, der abhängig von der Config die Widgets erzeugt (halt in diesem falle nicht lädt)

Im Gegensatz zu Plugins ist der "Loader" Teil der lib.

Das Plugininterface:



class DataWidget : public QWidget
{
Q_OBJECT
public:
DataWidget(QWidget*, const char*);
virtual ~DataWidget();

void addActionsToToolbar(QToolbar*);
void addActionsToMenu(QPopupMenu*);
};


Der Loader/Factory:



class WidgetFactory
{
DataWidget* createDataWidget(QWidget* parent,
const QString& configFile);
};


Die App


WidgetFactory *factory = new WidgetFactory();

QStringList files;
// config files finden

for (uint i = 0; i < files.count(); ++i)
{
DataWidget* dw = factory->createDataWidget(mainwindow, files[i]);
if (dw == 0)
{
dWarning("failed to create DataWidget for %s", (const char*) files[i]);
}
else
{
dw->addActionsToMenu(....);
dw->addActionsToToolbar(...);
}
}


Eventuell muß man das Hinzufügen der Actions wo anders machen, denn man sollte vielleicht
Dort auch die config lesen, um rauszufinden, in welcher Menu oder in welchen Toolbar die actions
eines DataWidgets gehören (siehe XML Ggui files von KDE)

Ciao,
_