Skip to content

RealChuan/Qt-App

Repository files navigation

Qt-App

图片资源等来自于互联网。 本代码仓库,仅供学习,若被他人用于商业用途 与本人无关! 请遵守许可证!

Qt-App

CrashReport

崩溃报告程序;

代码结构

  1. cmake:封装的CMake实用函数;
    1. utils:实用函数;
  2. doc:文档说明和图片;
  3. examples:示例代码;
  4. packaging:打包和发布;
  5. src:源码;
    1. 3rdparty:第三方库;

      1. qtlockedfile:Qt文件锁;
      2. qtsingleapplication:Qt单实例;
    2. aggregate:聚合;

    3. apps:应用程序;

      1. app:Qt-App;
      2. crashreport:CrashReport;
    4. core:插件都继承于此;

    5. dump:崩溃捕捉功能;

      1. breakpad:基于Google Breakpad封装的崩溃捕捉;

      2. crashpad:基于Google Crashpad封装的崩溃捕捉;

        在unix系统下,可能需要对crashpad_handler赋予执行权限,否则无法正常启动。

        chmod +x crashpad_handler
    6. extensionsystem:插件系统,代码来自于Qt-Creator,做了一些修改;

    7. gui:封装的界面组件;

    8. plugins:插件;

      1. aboutplugin:关于插件;
      2. coreplugin:核心插件,主界面、菜单、工具栏、状态栏、设置、插件管理器等;
      3. guiplugin:GUI插件,一些基于QSS样式定制的GUI组件;
      4. hashplugin:哈希插件,QT提供的哈希算法;
      5. helloplugin:Hello插件,用于测试插件开发;
      6. systeminfoplugin:系统信息插件;
    9. resource:图片和QSS文件;

    10. utils:工具函数封装;

  6. translations:翻译文件;

问题和备注

  • MacOS,cmake生成的bundle,在.app/Contents/文件夹下没有生成PkgInfo文件;

    1. app/CMakeLists,使用这个CMakeLists.txt可以在MacOS上生成bundle,也可以正常显示图标,但是没有PkgInfo文件;
    2. cmake该怎么生成PkgInfo文件?
      1. WireShark使用set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/PkgInfo PROPERTIES MACOSX_PACKAGE_LOCATION .)类似这种方式,拷贝到bundle中;
    3. qmake默认会生成PkgInfo文件,只需要指定TARGET=app或者CONFIG+=bundle即可;
  • Unix 系统下,需要尽量使用静态库,避免动态库的依赖问题;

    1. 本项目有几个模块是动态库,因为是plugin,需要动态加载;
    2. 然后需要对这几个动态库进行打包,然后在运行时加载,还需要对rpath"-Wl,-rpath,\'\$$ORIGIN\':\'\$$ORIGIN/lib\':'\$$ORIGIN/../lib'"),进行设置,否则会找不到动态库;
    3. 或者使用install_name_tool(macos)、patchelf/chrpath(linux)修改动态库的依赖路径,非常麻烦;
    4. 还要考虑到这些库都是可以共享的,所以不要重复打包;
    5. 具体可以看workflows
  • MacOS,vcpkg编译第三方库问题;

    1. 由于vcpkg目前只支持单独编译x64-osx和arm64-osx
    2. 在使用cmake时,需要指定CMAKE_OSX_ARCHITECTURES=x86_64或者CMAKE_OSX_ARCHITECTURES=arm64;
    3. 在使用qmake时,需要指定QMAKE_APPLE_DEVICE_ARCHS=x86_64或者QMAKE_APPLE_DEVICE_ARCHS=arm64
  • 国际化实时翻译,当前更改完翻译设置,需要重启程序才能生效;

    1. 更新翻译的命令

       cmake --build build --target Qt-App_lupdate
    2. 懒得改代码了;

    3. 具体参考: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;
         }
      }