#include #include #include #include #include #include #include #include "../interfaces/child_interface.h" #include "../interfaces/parent_interface.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow mainWindow; QWidget *centralWidget = new QWidget(&mainWindow); QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget); mainWindow.setCentralWidget(centralWidget); // Ordnerstruktur auflösen (.../build-.../plugins/) QDir baseDir(QCoreApplication::applicationDirPath()); baseDir.cdUp(); QDir pluginsDir = baseDir; if (!pluginsDir.cd(QStringLiteral("plugins"))) { qCritical() << "Plugins-Ordner nicht gefunden!"; return -1; } QMap parentPlugins; QList childPlugins; // Nur .so-Dateien auflisten (verhindert das Einlesen von cmake_install.cmake) QStringList filters; filters << QStringLiteral("*.so"); #ifdef Q_OS_WIN filters << QStringLiteral("*.dll"); #else filters << QStringLiteral("*.so"); #endif // 1. Durchlauf: Plugins laden und katalogisieren for (const QString &fileName : pluginsDir.entryList(filters, QDir::Files)) { QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); QObject *pluginInstance = loader.instance(); if (!pluginInstance) { qDebug() << "Überspringe Datei:" << fileName << loader.errorString(); continue; } // Ist es ein Parent? auto *parent = qobject_cast(pluginInstance); if (parent) { parentPlugins[parent->pluginName()] = parent; mainLayout->addWidget(parent->widget()); qDebug() << "Eltern-Plugin registriert:" << parent->pluginName(); continue; } // Ist es ein Child? auto *child = qobject_cast(pluginInstance); if (child) { childPlugins.append(child); qDebug() << "Kind-Plugin zwischengespeichert:" << child->childName(); } } // 2. Durchlauf: Zuordnen, Daten übergeben und Signale verbinden for (ChildInterface *child : childPlugins) { QString target = child->targetParentName(); if (parentPlugins.contains(target)) { ParentInterface *parent = parentPlugins[target]; // A. Widget zuweisen parent->addChildWidget(child->widget()); qDebug() << "Kind" << child->childName() << "wurde" << target << "zugeordnet."; // B. Initiale Parameterübergabe child->setParentData(QStringLiteral("Konfig-Paket via %1").arg(parent->pluginName())); // C. Dynamische Signal-Slot Live-Verbindung (Absturzsicher via Pointer-Check) QObject *parentObj = parent->qobjectInstance(); QObject *childObj = dynamic_cast(child); if (parentObj && childObj) { bool connected = QObject::connect(parentObj, SIGNAL(dataChangedLive(QString)), childObj, SLOT(updateLiveData(QString))); if (connected) qDebug() << "Live-Signal verbunden für:" << child->childName(); else qWarning() << "Verbindung fehlgeschlagen für:" << child->childName(); } else qWarning() << "Fehler beim Casten des Plugins" << child->childName() << "zu QObject!"; } else qDebug() << "Warnung: Kein Parent gefunden für" << child->childName(); } mainWindow.resize(500, 450); mainWindow.show(); return app.exec(); }