去官网下载,选择qt/下的完整安装包,会直接安装qtcreator:
选择你要安装版本下的.run(Linux)或.exe(windows)文件下载
cd ~/Downloads
sudo chmod +x qt-opensource-linux-x64-5.12.8.run
sudo ./qt-opensource-linux-x64-5.12.8.run
一路默认,安装过程中需要登陆的话,断网后重新安装,中间选择安装模块根据需要选择,qtcreator和gcc编译器一定要安装,图中漏选了编译器
记住使用sudo是将qt安装到了/opt目录下,后面卸载需要知道安装目录
安装 g++
sudo apt-get install g++
安装 openGL 库
sudo apt-get install mesa-common-dev
添加环境路径
sudo gedit ~/.bashrc
export PATH=/opt/Qt5.12.8/Tools/QtCreator/bin:$PATH
打开终端,运行qtcreator
qtcreator
双击安装包安装,不想登录账号就先断网,一路默认,只是下面选择要安装的模块,最重要的编译器和QtCreator一定要安装:
点击NEW
第一项为GUI,第二项为控制台编程,以选择GUI为例,填写项目名称,选择路径,并确定是否设置为默认路径:
next,Details设置类(窗口)名称,选择三种基类,设置是否生成ui,然后一路默认,创建完成
双击ui文件设计界面,左侧添加控件,右侧设置属性,中间为设置界面,下方连接信号槽:
左下角从下到上编译、调试、运行以及设置编译模式:
创建项目时编译系统选择cmake
自动生存CMakeLists.txt
编译的时候可以直接使用qtcreator,也可以使用cmake方式,进入项目文件夹下:
mkdir build && cd build
cmake ..
make -j4
以下内容需要注意Qt的位数需要和Python的位数一致(64/32),例如我的Qt5.12.8(MinGW64_bit)+Python3.10.0(64bit)(Windows) / Python3.8.0(64bit) (ubuntu)
在Tools->Options…->Environment->External Tools左下角添加新的目录以及工具(名称自定义)
在右侧填入配置:
Python解释器:找到自己安装的python的目录下的python.exe,我这里是(D:\Python\python.exe),
参数:%{CurrentDocument:FilePath}
工作目录:%{CurrentDocument:Path}
对于Linux:
Python解释器:/usr/bin/python3.8
在项目中新建文件,选择Python脚本文件
在新建的脚本文件中编写代码,如(matplotlib等其他Python库需要去命令行 pip install xxx 安装):
# This Python file uses the following encoding: utf-8
import matplotlib.pyplot as plt
# if __name__ == "__main__":
# pass
def temperImg():
plt.plot([1,2,1,4])
plt.show()
temperImg()
点击Tools->External找到刚刚添加的Python解释器运行:
创建了qt工程后编译生成release文件夹,将Python安装的文件夹整个复制到release文件夹下,以便Qt生成的可执行程序能够在当前目录下找到Python(release模式下,方便后面打包)
项目文件.pro 添加Python依赖头文件和库(在Python的include和libs文件夹内),指定位置为刚刚复制的文件夹内(注意-LD不是分开的,没有写错)
INCLUDEPATH += -I D:\qt5.12.8\works\build-qtEnvi-Desktop_Qt_5_12_8_MinGW_64_bit-Release\release\Python310\include
LIBS += -LD:\qt5.12.8\works\build-qtEnvi-Desktop_Qt_5_12_8_MinGW_64_bit-Release\release\Python310\libs -lpython310
对于Linux:
INCLUDEPATH += -I /usr/include/python3.8/
LIBS += -L /usr/lib/python3.8/config-3.8-x86_64-linux-gnu -lpython3.8
scriptFirst.py代码:
import matplotlib.pyplot as plt
def temperImg():
plt.plot([1,2,1,4])
plt.show()
temperImg()
C++调用Python的代码和函数(我直接写在了主函数中),有几点需要注意(代码中也有):
#include "qtenvimain.h"
// 由于python头文件中的slots和Qt中的信号槽相冲突,通过以下代码解决
#undef slots
#include
#define slots Q_SLOTS
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qtEnviMain w;
w.show();
// 0 准备
// 0.1 由于需要打包发布应用程序,因此需要指定可执行文件寻找的Python主目录,通过以下代码实现
QString path = QCoreApplication::applicationDirPath() + "/Python310";
Py_SetPythonHome((wchar_t*)(reinterpret_cast< const wchar_t* >(path.utf16())));
// 0.2 初始化python模块
Py_Initialize();
// 查看是否成功初始化
if ( !Py_IsInitialized() ){
return -1;
}
// PyRun_SimpleString:简单执行python命令的函数
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.argv = ['python.py']");
// 0.3 添加目录地址:把python文件放在此程序debug/realse文件内,
// 否则会出现没有找到python文件的错误,还有一种可能是python文件语法错误也会找不到python文件
PyRun_SimpleString("sys.path.append('./')");
// 无参无返回值调用
// 1 导入scriptSecond.py模块
PyObject* pModule;
pModule = PyImport_ImportModule("scriptFirst");
// 判断.py文件是否能调用
if (!pModule){
printf("Cant open python file!\n");
return -1;
}
// 2 获取scriptSecond模块中的temperImg函数
PyObject* pFunhello;
pFunhello = PyObject_GetAttrString(pModule,"temperImg");
if(!pFunhello){
cout<<"Get function hello failed"<<endl;
return -1;
}
// 3 无参调用temperImg函数
PyObject_CallObject(pFunhello,NULL);
// 4 调用结束,清理Python
Py_Finalize();
return a.exec();
}
ctrl+r 运行整个项目,运行结果是Cant open python file ! 需要将编写的Python脚本(scriptFirst.py)也复制到release文件夹下(说实话有点麻烦,在编写py文件的时候,但是还没找到更好的办法解决),再次运行成功
Linux同样复制到(没有子文件夹):
在release模式下编译程序,然后将release文件夹下的.exe文件复制到要制作的(随便/项目需要,自定义)程序文件夹下,并复制路径D:\qt5.12.8\works\MyAPP(你自己的):
win搜索qt,打开带有终端标志的qt程序
cd 到打包程序的文件夹下,使用windeployqt.exe打包程序(自动找到程序依赖的库并复制到此文件夹下):
打包成功,点击.exe文件即可运行程序
(1)首先将编写的.py文件、Python安装文件夹以及其下的python310.dll和python3.dll文件复制到打包程序文件下:
(2)按照windeployqt常规方式打包.exe
打包结束后,可以换一台没有qt和python运行环境的电脑下运行.exe文件进行测试是否裸机打包成功
安装时说了使用sudo将qt安装到了/opt目录下,进入到qt的安装目录下,运行./MaintenanceTool
根据提示卸载: