#include #include #include #include #include #include #include #include "mainwindow.h" #include "Presenter/Inc/ConfigManager.h" #include "Version.h" #include "SingleInstanceManager.h" // FFmpeg-rockchip 内部符号的 stub 定义(链接时需要但本进程不会真正调用) #ifdef __linux__ extern "C" { // rkmppdec.c 需要,但本进程只拉流解码,不用 encoder typedef int MppCodingType; const char* querystring(MppCodingType /*coding*/) { return "unknown"; } // libavutil 可能在未被直接引用时缺失 unsigned int ff_log_level = 0; } #endif namespace { QString resolveConfigPath() { // 1) exe 同目录下的 config/config.xml QDir d(QCoreApplication::applicationDirPath()); QString p = d.absoluteFilePath("config/config.xml"); if (QFileInfo::exists(p)) return p; // 2) 工作目录 p = QDir::current().absoluteFilePath("config/config.xml"); if (QFileInfo::exists(p)) return p; // 3) AppData (Windows) / 用户目录 (Linux) QString dataDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); QDir().mkpath(dataDir + "/DroneScrewCtrl"); return dataDir + "/DroneScrewCtrl/config.xml"; } } // namespace int main(int argc, char* argv[]) { QApplication a(argc, argv); a.setApplicationName(DRONESCREWCTRL_APP_NAME); a.setApplicationVersion(DRONESCREWCTRL_VERSION_STRING); a.setWindowIcon(QIcon(":/dronescrewctrl/resource/logo.png")); a.setStyleSheet(QStringLiteral( "QMessageBox { background-color: rgb(25, 26, 28); color: rgb(221, 225, 233); }" "QMessageBox QLabel { color: rgb(221, 225, 233); background-color: transparent; }" "QMessageBox QPushButton { background-color: rgb(47, 48, 52); color: rgb(221, 225, 233); border: 1px solid rgb(75, 78, 86); padding: 5px 16px; }" "QMessageBox QPushButton:hover { background-color: rgb(58, 60, 66); }")); qRegisterMetaType("CtrlDetectionFrame"); // 单实例检查(使用标准 SingleInstanceManager,确保退出时正确释放) SingleInstanceManager instanceMgr("DroneScrewCtrlApp"); if (instanceMgr.isAnotherInstanceRunning()) { QMessageBox::information(nullptr, QObject::tr("应用程序已运行"), QObject::tr("无人机螺杆控制端已经在运行中,请勿重复启动!"), QMessageBox::Ok); return 0; } QString configPath = resolveConfigPath(); ConfigManager::Instance().Initialize(configPath.toStdString()); MainWindow w; w.show(); return a.exec(); }