/*************************************************************************** BionxControl Copyright © 2025 christoph holzheuer christoph.holzheuer@gmail.com Using: BigXionFlasher USB V 0.2.4 rev. 97 © 2011-2013 by Thomas Koenig @see www.bigxionflasher.org Bionx Bike Info © 2018 Thorsten Schmidt (tschmidt@ts-soft.de) @see www.ts-soft.de mhs_can_drv.c 3.00 © 2011 - 2015 by MHS-Elektronik GmbH & Co. KG, Germany Demlehner Klaus, info@mhs-elektronik.de @see www.mhs-elektronik.de This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. @see https://github.com/bikemike/bionx-bikeinfo ***************************************************************************/ #include #include #include #include #include // main.cpp #include #include #include #include #include #include #include #include #include bool setApplicationStyleSheet( QAnyStringView path ) { QFile styleFile( path.toString() ); if (styleFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QString style = styleFile.readAll(); qApp->setStyleSheet(style); styleFile.close(); return true; } qWarning() << "Konnte Stylesheet nicht laden:" << styleFile.errorString(); return true; } struct moo { QString moo_str {"irgendwas"}; }; // Verschiedene Datentypen für die Sensoren struct Temperature : public moo{ float celsius; }; struct CpuLoad : public moo{ int percentage; }; struct Status : public moo{ std::string message; }; // Die Variant als universeller Datencontainer using SensorReadingPtr = std::variant; struct UIUpdateVisitor { QLabel* tempLabel; QProgressBar* cpuBar; QLabel* statusLabel; // Überladene operator() für jeden Typ in der Variant double operator()(Temperature* t) const { //tempLabel->setText(QString("Temp: %1°C").arg(t.celsius, 0, 'f', 1)); //tempLabel->setStyleSheet(t.celsius > 40 ? "color: red;" : "color: black;"); return -1; } double operator()(CpuLoad* c) const { cpuBar->setValue(c->percentage); qDebug() << c->moo_str; return -42.0; } double operator()(const Status* s) const { //statusLabel->setText(QString::fromStdString(s.message)); return -1; } }; void onNewDataReceived(const SensorReadingPtr& data) { QLabel* labelTemp = nullptr; QProgressBar* progressCpu = nullptr; QLabel* labelStatus = nullptr; // Wir erstellen den Visitor mit Referenzen auf unsere UI-Elemente UIUpdateVisitor visitor { labelTemp, progressCpu, labelStatus }; // Die Magie: std::visit wählt zur Kompilierzeit die richtige Methode double result = std::visit(visitor, data); Q_UNUSED(result) Temperature myTemp{}; SensorReadingPtr xxx{&myTemp}; double result2 = std::visit(visitor, SensorReadingPtr{&myTemp} ); } struct mookoo { QString a="firz"; int b=2; double c=1.0; QString hidden{"Fatz!"}; }; struct mookoo2 : public mookoo { int another; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); setApplicationStyleSheet( ":/bionxcontrol.qss"_L1 ); mookoo myMookoo{"",1,1.0}; mookoo myMooko2{"",1}; mookoo2 myMooko3{{"superfitze",1},8}; qDebug() << " --- haha: " << myMooko3.a << ": " << myMooko3.hidden; BCMainWindow w; w.show(); return app.exec(); }