• C++ Qt 学习(十):Qt 其他技巧


    1. 带参数启动外部进程

    • QProcess 用于启动外部进程
      int QProcess::execute(const QString &program, const QStringList &arguments);
      
      QObject *parent;
      ...
      QString program = "./path/to/Qt/examples/widgets/analogclock";
      QStringList arguments;
      arguments << "-style" << "fusion";
      
      QProcess *myProcess = new QProcess(parent);
      myProcess->start(program, arguments);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

    1.1 widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    
    class Widget : public QWidget {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private slots:
        void on_pushButton_clicked();
    private:
        Ui::Widget *ui;
    };
    #endif // WIDGET_H
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    1.2 widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include 
    
    Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
        ui->setupUi(this);
    }
    
    Widget::~Widget() {
        delete ui;
    }
    
    void Widget::on_pushButton_clicked() {
        QString exe_path = "D:/download/qt_test/build-AAA-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug/debug/AAA.exe";
    
        QStringList argList;
        argList.append("yse");
        argList.append("start");
    
        QProcess p;
        p.execute(exe_path, argList);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    1.3 外部进程 main.cpp

    #include "widget.h"
    #include 
    
    int main(int argc, char *argv[]) {
        QApplication a(argc, argv);
    
        // AAA.exe -yes -start
        if(argc != 3) {
            return -1;
        } else {
            QString str1 = QString(argv[1]);
            QString str2 = QString(argv[2]);
    
            if(!str1.compare("yes") && !str2.compare("start")) {
                Widget w;
                w.show();
                return a.exec();
            }
        }
    
        return -2;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    2. QtCreator 链接第三方库

    • 在 .pro 或 .pri 文件添加 include 路径和 lib 的名字
      // 头文件路径
      INCLUDEPATH += ./vlc-3.0.8-win32/sdk/include
      
      // lib 名字,有多个 lib 就写多行 LIBS +=
      LIBS += $$PWD/vlc-3.0.8-win32/sdk/lib/libvlc.lib
      LIBS += $$PWD/vlc-3.0.8-win32/sdk/lib/libvlccore.lib
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    3. windeployqt 提取 Qt 依赖库

    打包应用程序到其他电脑运行,需要提取运行时所需依赖库,以某视频播放器为例

    • 首先将 D:\Qt5\5.15.2\msvc2019\bin 添加进电脑系统环境变量 path 中
      在这里插入图片描述

    • 在需要打包的视频播放器 .exe 同级目录下运行 windeployqt MediaPlayer.exe
      在这里插入图片描述

    • 生成的依赖库如下图所示
      在这里插入图片描述

    • 运行 windeployqt 可能遇到如下警告

      Warning:Cannot find Visual Studio installation direction, VCINSTALLDIR is not set
      
      • 1
    • 解决办法:新建环境变量

      VCINSTALLDIR
      C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC
      
      • 1
      • 2

    4. VS2019 Qt win32 项目添加 x64 编译方式

    在这里插入图片描述

    5. QTranslator 实现多语言与国际化

    • 解决 Qt 乱码最好的方法是使用 gt 翻译文件
    • 给需要翻译的文本加上 tr, 例如
      ui->label_userName->setText(tr("username"));
      ui->label_pwd->setText(tr("pwd"));
      ui->btnLogin->setText(tr("login"));
      
      • 1
      • 2
      • 3

    5.1 生成 ts 文件

    • .pro 文件添加 ts 文件

      TRANSLATIONS = testlang.ts
      
      • 1
    • 在开始菜单找到 Qt 控制台窗口,cd 到项目目录,执行如下命令生成 ts 文件
      在这里插入图片描述

      lupdate testlang.pro  
      
      • 1

    5.2 生成 qm 文件

    • 在开始菜单找到 Qt 语言专家,打开 ts 文件,逐个翻译
      在这里插入图片描述

    在这里插入图片描述

    • 全部翻译结束后,保存,点击菜单:文件——发布

      • 注意:点击发布时没有弹出窗口,在 pro 目录会直接生成 qm 文件
    • 最后需要在项目 debug 目录下新建 lang 文件夹,并把上面生成的 qm 文件拷贝进去
      在这里插入图片描述

    5.3 具体实现

    在这里插入图片描述

    • widget.cpp

      #include "widget.h"
      #include "ui_widget.h"
      
      Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
          ui->setupUi(this);
      
          ui->label_username->setText(tr("username"));
          ui->label_pwd->setText(tr("pwd"));
          ui->btnLogin->setText(tr("btnlogin"));
      }
      
      Widget::~Widget() {
          delete ui;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    • main.cpp

      #include "widget.h"
      #include 
      #include 
      
      int main(int argc, char *argv[]) {
          QApplication a(argc, argv);
      
          QTranslator *trans = new QTranslator();
      
          // 注意路径的反斜线,翻译文件加载错误将不会翻译
          QString qm_path = a.applicationDirPath() + "/lang/testlang.qm";
          trans->load(qm_path);
          a.installTranslator(trans);
      
          Widget w;
          w.show();
          return a.exec();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
  • 相关阅读:
    如何使用 apt-get 安装特定版本的软件包
    Java SE中的运算符讲解
    不同服务器节点之间 如何实现高效可靠的文件同步?
    Java计算机毕业设计电影院购票系统源码+系统+数据库+lw文档
    59 分割等和子集
    ES学习笔记
    终于有人把大数据的相关知识讲全了(大数据基础框架、数据库、大数据分析分布式技术),从入门到进阶全部涵盖了!
    壁炉装饰:突破传统的创新趋势
    利用datafaker批量生成测试数据
    opencv的色彩空间
  • 原文地址:https://blog.csdn.net/qq_42994487/article/details/134489840