文章目录
一、如何带参数启动外部进程
QProcess
是Qt提供的一个类,用于启动和管理外部进程。
-
使用
QProcess
的start
方法来异步启动一个进程 -
使用
QProcess::execute
方法来同步启动一个进程,立即执行一个命令并等待它完成。在主进程程序中,使用QProcess带参数启动外部线程
QString exePath = qApp->applicationDirPath(); QString _exe = exePath + "/tese.exe"; QProcess program; QStringList args; args.append("yse"); args.append("start"); //start 异步 //execute 同步 p.execute(_exe, args);
在外部进程中,需要对参数进行判断
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.为什么会链接第三方库
在编写代码时,我们可能会使用一些第三方库来实现一些功能或者提供一些便利性的功能。当我们在代码中调用这些第三方库提供的函数或类时,编译器会在编译时将这些函数或类的定义与我们的代码进行链接,以便在运行时能够正确地调用这些函数或类。
在使用Qt Creator等开发工具时,我们需要在项目配置中添加这些第三方库的路径和名称,以告诉编译器在编译时要链接这些库。这样在编译完成后,生成的可执行文件才能够正确地调用这些第三方库提供的功能。
2.QtCreator如何链接第三方库?
在pro或pri文件中添加include路径和lib的名字
#window平台opencv,seetaface环境
win32{
LIBS +=C:\opencv452\x64\mingw\lib\libopencv*
LIBS +=C:\SeetaFace\lib\libSeeta*
INCLUDEPATH +=C:\opencv452\include
INCLUDEPATH += C:\opencv452\include\opencv2
INCLUDEPATH += C:\SeetaFace\include
INCLUDEPATH += C:\SeetaFace\include\seeta
}
#linux平台opencv seetaface环境
unix{
#lib有多个的话可以写多行,在同一目录下可以写一行
LIBS += -L/opt/opencv4-arm/lib -lopencv_world
#-lSeetaFaceDetector \
#-lSeetaFaceLandmarker \
#-lSeetaFaceRecognizer \
#-lSeetaFaceTracker \
#-lSeetaNet \
#-lSeetaQualityAssessor \
INCLUDEPATH += /opt/opencv4-arm/include/opencv4
INCLUDEPATH += /opt/opencv4-arm/include/opencv4/opencv2
INCLUDEPATH += /opt/opencv4-arm/include
INCLUDEPATH += /opt/opencv4-arm/include/seeta
}
3.VS2019如何链接第三方库
将SDK copy到项目中,打开项目,右键项目属性进行配置,include、lib
-
include:右击“属性”,配置属性,点击“C/C++”->“常规”,在“附加包含目录”中添加头文件目录
-
lib:右键“属性”,配置属性,点击“链接器”–>“常规”,在“附加库目录”中添加库文件目录
-
点击“链接器”–>“输入”,在“附加依赖项”中添加lib库名称
点击“确定”–>“应用“,项目属性配置完成
也可以选择不在属性页添加库,而在代码中添加。如:
#pragma comment(lib, "libvlc.lib")
注意:库的编译是分版本的,一定要选择与项目一样的版本
三、windeployqt提取Qt依赖库
当我们的程序运行好之后,拿给别人用的时候,需要提取一些Qt的依赖库,此时需要打包工具:windeployqt。windeployqt
是 Qt 提供的一个工具,用于自动化在 Windows 平台上部署 Qt 应用程序的过程,它会复制所有必要的 Qt DLLs 到你的应用程序的目录中。
windeployqt
提取 Qt 依赖库的基本步骤:
-
构建应用程序
确保应用程序已经构建完成,并且是可执行的,注意:在构建时常用debug与relese编译,一般来说:Debug版本适用于开发和测试阶段,能够提供更多的调试信息和便于定位问题;而Release版本适用于性能优化、部署和发布阶段,能够提供更好的性能和用户体验。
这两个版本的区别:
Release版本 Debug版本 性能差异 Release版本通常会进行优化,以提高程序的性能和运行速度。 Debug版本通常包含更多的调试信息,可能会牺牲一些性能以便于调试和跟踪问题。 编译标志 Release版本则会启用优化和去除调试信息 Debug版本通常会包含调试信息、关闭优化等设置 输出文件 Release版本的输出文件则会进行优化以提高性能。 Debug版本的输出文件通常包含调试信息 运行行为 Release版本则更适合最终部署和发布,因为它们通常具有更好的性能和较小的体积 Debug版本包含更多的调试信息,可能会占用更多的内存和磁盘空间。 -
查看生成的编译文件,以release版本为例
-
将windeployqt.exe的路径添加到系统环境变量,
-
将生成的exe程序拿出来单独放到一个文件夹里
-
在该文件夹下运行cmd,输入命令:
windeployqt 10_1_QProcess.exe
此时,会在文件夹里生成需要的依赖文件
-
把这个文件夹发给别人,如果他们电脑上没有qt环境,也可以运行,说明打包成功。
如果缺库,在自己电脑里找到,将缺的库复制给同事
运行windeployqt可能遇到如下警告:
Warning: Cannot find Visual Studio installation directory, VCINSTALLDIR is not set
解决办法:
新建环境变量:VCINSTALLDIR
四、VS2019 Qt win32项目如何添加x64编译方式
vs2019在编译项目的时候是需要选择编译环境的,可以是32位编译也可以是64位编译,那么一个用32位编译的项目默认是没有64位编译方式的,若想要添加64位编译方式时,该怎么操作呢?
解决办法:在配置管理器里选择新建解决方案平台x64,从x86里复制设置
点击“配置管理器”,新建活动解决方案平台
从x86里复制设置
点击“确定”,此时,完成添加x64编译方式
五、Qt多语言与国际化
解决Qt中文乱码最好的方法是使用qt翻译文件。
操作流程:
-
使用tr()函数标记待翻译文本
在代码中,使用
QObject::tr()
函数来标记所有需要翻译的字符串。对于QML代码,则使用qsTr()
。这样做可以让lupdate
工具识别并提取这些字符串ui->label_userName->setText(tr("username")); ui->label_pwd->setText(tr("pwd")); ui->btnLogin->setText(tr("login"));
-
生成翻译文件(ts文件)
使用Qt提供的工具
lupdate
来扫描源代码中的tr()
函数调用,并生成.ts
格式的翻译文件。-
找到Qt控制台窗口
-
在项目的pro文件中添加ts文件:
TRANSLATIONS = testlang.ts
,然后运行项目 -
cd到项目目录,执行如下命令生成ts文件:
lupdate testlang.pro
此时,生成ts文件
-
-
编辑翻译文件,生成编译后的翻译文件-qm文件
使用Qt Linguist工具打开
.ts
文件,逐个翻译。全部翻译结束后,保存。点击菜单文件-发布,在点击发布时没有弹窗,会在pro目录下会生成qm文件
Qt Linguist提供了方便的界面来添加和编辑翻译
-
应用程序加载qm文件
在应用程序中,使用
QTranslator
类来加载.qm
文件,并通过QApplication::installTranslator()
函数将翻译器安装到应用程序中。这样就可以根据用户的语言设置显示对应的翻译文本int main(int argc, char *argv[]) { QApplication a(argc, argv); QTranslator *trans = new QTranslator(); //注意路径的反斜线,翻译文件加载错误将不会翻译 QString qm_path = a.applicationDirPath() + "/lang/testlang.qm"; //trans->load("D:/Project/QtProject/trans/testlang.qm"); trans->load(qm_path); a.installTranslator(trans); Widget w; w.show(); return a.exec(); }
运行结果: