Files
qt-migration-legatus/qt5-before/dlbo/Lts/Tools/Examples/Plugins/app/main.cpp
T
torstenandCopilot 7173785915 Qt6 Migration: Complete migration with DDS/RTI support and build validation
Major Changes:
- Merged latest Qt5 devel content from dlbo (292 files changed, 7 new dirs)
- Consolidated forward-declarations and include folders
- Removed unneeded modules per Niklas' repo check list

Build System Fixes:
- Fixed CMake VERSION_GREATER syntax in ParticipantManagement/CMakeLists.txt
- Added VLC packages (libvlc-dev, vlc-plugin-base) to docker_build.sh
- Added PostgreSQL dev packages (libpq-dev, postgresql-server-dev-all) to Dockerfile
- Fixed locale warnings (ANSI_X3.4-1968 → C.UTF-8)
- Fixed ArcGIS SDK path warnings when BUILD_ARCGIS=OFF

Code Generation Fixes:
- Fixed IDL enum collisions (PortType→CorePortType/DdsutPortType, PdmEventType)
- Fixed Grantlee template svc_translation.cpp.grantlee:
  - Changed {{ idl_enum.name }}_def:: to {{ idl_enum.name }}::
  - Fixed .underlying() calls for C++11 scoped enums (enum class)
- Removed generated files from repo (moc_*, *_dtc.h, *_ftc.h)

Validation:
- BUILD_RTI=ON: SUCCESS
- BUILD_RTI=OFF: SUCCESS
- C++17 standard maintained for RTI 7.7 compatibility
- Ubuntu 26.04 Docker environment verified

Remaining Warnings (expected):
- BgViewer, KDChart, KDReports, Poppler-Qt6 not found (optional features)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-09-15 18:20:26 +00:00

113 lines
3.4 KiB
C++

#include <QApplication>
#include <QDebug>
#include <QDir>
#include <QMainWindow>
#include <QMap>
#include <QPluginLoader>
#include <QVBoxLayout>
#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<QString, ParentInterface *> parentPlugins;
QList<ChildInterface *> 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<ParentInterface *>(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<ChildInterface *>(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<QObject *>(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();
}