图片资源等来自于互联网。 本代码仓库,仅供学习,若被他人用于商业用途 与本人无关! 请遵守许可证!
- 插件式开发的桌面应用程序框架,可以用于快速开发桌面应用程序; qt-creator/src/libs/extensionsystem at master · qt-creator/qt-creator (github.com);
- 配合vcpkg进行使用;
- 同时支持cmake和qmake编译;
- 支持Apple Silicon原生编译;
- 支持actions编译,打包、发布;
崩溃报告程序;
- cmake:封装的CMake实用函数;
- utils:实用函数;
- docs:文档说明和图片;
- examples:示例代码;
- packaging:打包和发布;
- src:源码;
-
3rdparty:第三方库;
- qtlockedfile:Qt文件锁;
- qtsingleapplication:Qt单实例;
-
aggregate:聚合;
-
apps:应用程序;
- app:Qt-App;
- crashreport:CrashReport;
-
core:插件都继承于此;
-
dump:崩溃捕捉功能;
-
extensionsystem:插件系统,代码来自于Qt-Creator,做了一些修改;
-
gui:封装的界面组件;
-
plugins:插件;
- aboutplugin:关于插件;
- coreplugin:核心插件,主界面、菜单、工具栏、状态栏、设置、插件管理器等;
- guiplugin:GUI插件,一些基于QSS样式定制的GUI组件;
- hashplugin:哈希插件,QT提供的哈希算法;
- helloplugin:Hello插件,用于测试插件开发;
- systeminfoplugin:系统信息插件;
-
resource:图片和QSS文件;
-
utils:工具函数封装;
-
- translations:翻译文件;
-
MacOS,cmake生成的bundle,在.app/Contents/文件夹下没有生成
PkgInfo
文件;- app/CMakeLists,使用这个CMakeLists.txt可以在MacOS上生成bundle,也可以正常显示图标,但是没有PkgInfo文件;
- cmake该怎么生成PkgInfo文件?
- WireShark使用
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/PkgInfo PROPERTIES MACOSX_PACKAGE_LOCATION .)
类似这种方式,拷贝到bundle中;
- WireShark使用
- qmake默认会生成PkgInfo文件,只需要指定
TARGET=app
或者CONFIG+=bundle
即可;
-
Unix 系统下,需要尽量使用静态库,避免动态库的依赖问题;
- 本项目有几个模块是动态库,因为是plugin,需要动态加载;
- 然后需要对这几个动态库进行打包,然后在运行时加载,还需要对rpath
"-Wl,-rpath,\'\$$ORIGIN\':\'\$$ORIGIN/lib\':'\$$ORIGIN/../lib'")
,进行设置,否则会找不到动态库; - 或者使用install_name_tool(macos)、patchelf/chrpath(linux)修改动态库的依赖路径,非常麻烦;
- 还要考虑到这些库都是可以共享的,所以不要重复打包;
- 具体可以看workflows;
-
MacOS,vcpkg编译第三方库问题;
- 由于vcpkg目前只支持单独编译x64-osx和arm64-osx;
- 在使用cmake时,需要指定
CMAKE_OSX_ARCHITECTURES=x86_64
或者CMAKE_OSX_ARCHITECTURES=arm64
; - 在使用qmake时,需要指定
QMAKE_APPLE_DEVICE_ARCHS=x86_64
或者QMAKE_APPLE_DEVICE_ARCHS=arm64
;
-
国际化实时翻译,当前更改完翻译设置,需要重启程序才能生效;
-
更新翻译的命令
cmake --build build --target Qt-App_lupdate
-
懒得改代码了;
-
具体参考:QT实用小技巧(想到就更新),核心代码;
void Widget::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: comboBox->setItemText(0, tr("Hello")); label->setText(tr("Hello")); // 代码添加的文字 ui->retranslateUi(this); // 有UI文件情况下 break; default: break; } }
-