当前位置: 首页 > news >正文

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.1 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

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 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QProcess>

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.3 外部进程 main.cpp

#include "widget.h"
#include <QApplication>

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;
}

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
    

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
    
  • 解决办法:新建环境变量

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

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"));
    

5.1 生成 ts 文件

  • .pro 文件添加 ts 文件

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

    lupdate testlang.pro  
    

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;
    }
    
  • main.cpp

    #include "widget.h"
    #include <QApplication>
    #include <QTranslator>
    
    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();
    }
    

相关文章:

  • SpringMvc请求原理流程
  • 文件转换,简简单单,pdf转word,不要去找收费的了,自己学了之后免费转,之后就复制粘贴就ok了
  • 关于缓存和数据库一致性问题的深入研究
  • 2023.11.19 hadoop之MapReduce
  • 网络层——IP协议
  • 【C++】【Opencv】霍夫直线检测即cv::HoughLinesP()函数详解和示例
  • 云计算(Docker)
  • 此芯科技加入绿色计算产业联盟,参编绿色计算产业发展白皮书
  • Python大数据之linux学习总结——day10_hive调优
  • 系列六、GC垃圾回收【四大垃圾算法-标记清除算法】
  • git使用及常用命令
  • 【Go入门】并发
  • 【Proteus仿真】【51单片机】锂电池管理系统
  • 《QT从基础到进阶·三十三》QT插件开发QtPlugin
  • vue3 实现pdf预览
  • JAXB实现XML和Bean相互转换
  • css 设置网页最小字体为12px
  • Flutter 中在单个屏幕上实现多个列表
  • Go vs Rust:文件上传性能比较
  • 循环神经网络RNN完全解析:从基础理论到PyTorch实战
  • 车载抬头显示爆发在即?业内:凭借市场和产业链优势,国内供应商实现反超
  • 多条跨境铁路加速推进,谁是下一个“超级枢纽”?
  • 国台办:民进党当局刻意刁难大陆配偶,这是不折不扣的政治迫害
  • 国台办:实现祖国完全统一是大势所趋、大义所在、民心所向
  • 乌方:泽连斯基只接受与普京会谈,拒见其他俄代表
  • 中医的千年传承:网络科学描绘其演化之路|PNAS速递