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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/164231.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP32 MicroPython 蜂鸣器及传感器的使用⑦

ESP32 MicroPython 蜂鸣器及传感器的使用⑦ 1、蜂鸣器奏乐2、实验目的3、实验内容5、实验结果6、小车传感器应用7、实验目的8、实验内容9、参考代码10、实验结果 1、蜂鸣器奏乐 我们小车底板配置有蜂鸣器&#xff0c;下面我们来学习如何去利用蜂鸣器演奏乐曲 2、实验目的 学…

如何将 Docsify 项目部署到 CentOS 系统的 Nginx 中

文章目录 第一步&#xff1a;准备 CentOS 服务器第二步&#xff1a;安装 Node.js 和 Docsify第三步&#xff1a;初始化 Docsify 项目第四步&#xff1a;本地预览 Docsify 项目第五步&#xff1a;配置 Nginx 服务器第六步&#xff1a;重启 Nginx 服务器拓展&#xff1a;使用 HTT…

VisualBox7.0.12 主机和宿舍互PING设置

设置成桥接模式 主机设置 虚拟机设置

day07_数组初识

数组的概述 数组就是用于存储数据的长度固定的容器&#xff0c;保证多个数据的数据类型要一致。 数组适合做一批同种类型数据的存储 数组是属于引用数据类型&#xff0c; 数组变量名中存储的数组在内存中的地址信息。 数组中的元素可以是基本数据类型&#xff0c;也可以是引用…

[qemu逃逸] DefconQuals2018-EC3

前言 一道简单的套壳堆题.原本题目环境为 ubu16, 我这里使用的是 ubu18 设备逆向 qemu-system-x86_64 只开了 Canary 和 NX 保护. 比较简单, 主要逻辑在 mmio_write 里面, 其实现了一个菜单堆, 具有增删改的功能: 但是在释放堆块时并没有置空, 所以这里存在 UAF. 而程序还直…

.Net中Redis的基本使用

前言 Redis可以用来存储、缓存和消息传递。它具有高性能、持久化、高可用性、扩展性和灵活性等特点&#xff0c;尤其适用于处理高并发业务和大量数据量的系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。 Redis的使用 安装包Ser…

IIC通信协议

IIC是串行半双工同步总线 I2C总线为两线制&#xff0c;只有两根双向信号线&#xff0c;一根是数据线SDA&#xff0c;另一根是时钟线SCL&#xff0c;IIC总线外接两个上拉电阻作用&#xff1a;在总线处于空闲状态&#xff0c;总线处于高电平状态 IIC总线硬件连接 1、IIC总线支…

tamarin运行

首先我们找到安装tamarin的文件位置&#xff0c;找到以后进入该文件夹下 ubuntuubuntu:~$ sudo find / -name tamarin-prover /home/linuxbrew/.linuxbrew/var/homebrew/linked/tamarin-prover /home/linuxbrew/.linuxbrew/Cellar/tamarin-prover /home/linuxbrew/.linuxbrew/…

URAT串口通信协议

UART是异步串行全双工总线&#xff0c;面向设备和设备之间的连接 配置相关内容 1、串口为串行通讯方式&#xff0c;代表一个时钟周期&#xff0c;只可以收发一位数据 2、115200代表什么&#xff0c;以及115200单位 单位&#xff1a;bps(比特率、二进制/秒) 115200代表&#…

泉盛UV-K5/K6全功能中文固件

https://github.com/wu58430/uv-k5-firmware-chinese/releases 主要功能&#xff1a; 中文菜单 许多来自 OneOfEleven 的模块&#xff1a; AM 修复&#xff0c;显著提高接收质量长按按钮执行 F 操作的功能复制快速扫描菜单中的频道名称编辑频道名称 频率显示选项扫描列表分配…

mysql 实现去重

个人网站 首发于公众号小肖学数据分析 1、试题描述 数据表user_test如下&#xff0c;请你查询所有投递用户user_id并且进行去重展示&#xff0c;查询结果和返回顺序如下 查询结果和返回顺序如下所示 解题思路&#xff1a; (1) 对user_id列直接去重&#xff1a; &#xff…

小程序开通电子发票

总目录 文章目录 总目录前言结语 前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 首先登录商户号&#xff1a;https://pay.weixin.qq.com/index.php/core/home/lo…

FPGA模块——IIC协议(读写PCF8591)

FPGA模块——IIC协议&#xff08;读取PCF8591&#xff09; PCF8591/AT8591芯片对iic协议的使用 PCF8591/AT8591芯片 低功耗8位CMOS数据采集设备&#xff0c;4路模拟输入&#xff0c;1路模拟输出&#xff0c;分时多路复用&#xff0c;读取数据用串型iic总线接口&#xff0c;最大…

计算机硬件的基本组成

一、冯诺依曼结构 存储程序&#xff1a; “存储程序”的概念是指将指令以二进制代码的形式事先输入计算机的主存储器&#xff0c;然后按其在存储器中的首地址执行程序的第一条指令&#xff0c;以后就按该程序的规定顺序执行其他指令&#xff0c;直至程序执行结束。 冯诺依曼计…

Linux进程间通信之匿名管道

文章目录 为什么要有进程间通信pipe函数共享管道原理管道特点管道的应用场景&#xff08;进程池&#xff09;ProcessPool.ccTask.hpp 为什么要有进程间通信 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通…

FlinkCDC数据实时同步Mysql到ES

考大家一个问题&#xff0c;如果想要把数据库的数据同步到别的地方,比如es,mongodb,大家会采用哪些方案呢&#xff1f; ::: 定时扫描同步&#xff1f; 实时日志同步? 定时同步是一个很好的方案&#xff0c;比较简单&#xff0c;但是如果对实时要求比较高的话&#xff0c;定…

JAVAEE---计算机是如何组成的

计算机软件硬件 硬件是冯诺依曼体系结构&#xff0c;这个结构的精髓在于将存储和执行分开。 这里存储器内存外存&#xff08;硬盘&#xff0c;u盘&#xff0c;光碟等&#xff09; cpu是计算机的大脑&#xff0c;是计算机最核心的地方。 cpu中央处理&#xff1a;进行算术运算…

ESP32 Arduino实战协议篇-搭建独立的 Web 服务器

在此项目中,您将创建一个带有 ESP32 的独立 Web 服务器,该服务器使用 Arduino IDE 编程环境控制输出(两个 LED)。Web 服务器是移动响应的,可以使用本地网络上的任何浏览器设备进行访问。我们将向您展示如何创建 Web 服务器以及代码如何逐步工作。 项目概况 在直接进入项目…

03. Python中的语句

1、前言 在《Python基础数据类型》一文中&#xff0c;我们了解了Python中的基础数据类型&#xff0c;今天我们继续了解下Python中的语句和函数。 2、语句 在Python中常用的语句可以大致分为两类&#xff1a;条件语句、循环语句。 2.1、条件语句 条件语句就是我们编码时常见…