Qt与Python混合编程(一)

前言

本文主要介绍使用Qt和Python进行混合编程的环境搭建。

运行环境

  • Qt 5.13.0 64位 MinGW-64编译器
  • Python 3.9.6 64bit

注意 Qt编译器的版本号需要和Python的版本号一致,不然编译时候报错。

环境搭建

  • 打开Qt创建一个项目,创建完毕后在项目中创建一个目录thirdLibs用来存放python的头文件和链接库。
  • 下载python后安装,找到安装目录,将Python目录中的include 和libs 拷贝到Qt工程中的thirdLibs目录中。
  • 将python目录下的python3.dll以及python39.dll拷贝到Qt工程生成的exe同目录(比如:XXX-Desktop_Qt_5_13_0_MinGW_64_bit-Debug\debug)
  • 打开Qt项目的pro配置文件,将python的头文件和库文件的依赖路径添加到配置文件中。
win32: LIBS += -L$$PWD/thirdLibs/libs/ -lpython3 -lpython39
INCLUDEPATH += $$PWD/thirdLibs/include
  • 在exe运行目录中创建目录python,用来存放后续使用的python库及依赖文件。将python安装目录中的Dlls,include,Lib,libs,tcl,Tools目录拷贝到刚刚创建的python中。

编写Pyhton程序

  • 创建python程序命名为qt_test.py 内容为:
def hello():
	print("hello world!")
  • 将创建好的python文件放到exe运行的目录。

编写Qt程序

-引入头文件,由于python头文件中的slots和Qt中的信号曹相冲突,通过一下代码解决。

#undef slots
#include <Python.h>
#define slots Q_SLOTS
  • 编辑main函数
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
	//配置Python环境目录为exe运行目录下的python环境
	QString path = QCoreApplication::applicationDirPath() + "/python";
	Py_SetPythonHome((wchar_t*)(reinterpret_cast< const wchar_t* >(path.utf16())));

    //初始化python模块
    Py_Initialize();

    if ( !Py_IsInitialized() )
    {
        PyErr_Print();
        return -1;
    }
    //导入qt_test.py模块
    PyObject* pModule = PyImport_ImportModule("qt_test");
    if (!pModule)
    {
        printf("Cant open qt_test file!\n");
        return -1;
    }

    PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello");  // 这里的hello就是python文件定义的函数
    if(!pFunhello)
    {
        PyErr_Print();
        qDebug()<<"Get function hello failed";
        return -1;
    }
    PyObject_CallFunction(pFunhello,NULL);
    //结束,释放python
    Py_Finalize();
    return a.exec();
}

运行程序

如果上面步骤都配置正确,Qt的应用程序输出窗口会打印:
helloworld!

后续

  • 虽然此时Qt可以运行python程序了,但是pyhon的运行环境实在庞大,再还没有安装numpy等需要用到的科学库的情况下已经达到惊人的100M+,这种情况对于实际应用中是不可接受的。因此需要使用体积更小的python环境。
  • 去python官网上下载对应的嵌入式版本比如我下载的:python-3.9.6-embed-amd64.zip 这个版本是绿色版下载后解压就可直接运行。
  • 将解压后的程序拷贝到Qt项目中exe的运行目录将将python-3.9.6-embed-amd64目录该名为python39
  • 进入python39将python39.zip解压到本地并重新命名为Lib
  • 进入Qt工程将main函数中的python运行环境目录修改为:
 	QString path = QCoreApplication::applicationDirPath() + "/python39";
    Py_SetPythonHome((wchar_t*)(reinterpret_cast< const wchar_t* >(path.utf16())));
  • 重新编译Qt项目,运行,OK!
  • 此时exe程序下的python运行环境也就 10M+。
  • 打工完成!

demo下载

demo下载

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt是一个跨平台的应用程序开发框架,常用于C++开发Python是一种动态类型的脚本语言混合编程指的是在一个项目中同时使用Qt/C++和Python进行开发混合编程的好处是可以充分发挥QtPython各自的优势。Qt/C++可以提供高性能和可靠性,适用于底层开发和系统级编程Python则提供了简洁易懂、高效编程以及大量的第三方库,适用于快速开发和原型设计。 混合编程的打包过程可以分为以下几个步骤: 首先,需要安装相应的编译工具和开发环境,如Qt、C++编译器和Python解释器。确定使用的Qt版本与Python版本兼容。 其次,需要为C++部分编写Qt代码,并将其编译成dll或so动态链接库,以供Python调用。这需要使用Qt提供的相关工具和库进行编译和链接。 然后,使用Python的相关库(如PyQt或PySide)来调用C++部分的Qt代码,并将其与Python代码结合起来。这样,就可以实现Qt界面与Python逻辑的交互。 最后,将项目打包成可执行文件、二进制文件或安装包。这可以使用Qt提供的打包工具,如Qt Installer Framework,或者使用第三方工具和脚本来完成。 需要注意的是,在混合编程和打包过程中,需要仔细处理Qt的信号与槽机制与Python的回调机制之间的交互,以确保二者能够正常工作。 总之,Qt C++和Python混合编程可以充分利用两者的优势,打包则需要注意兼容性和交互的处理。这种方式可以更灵活地开发应用程序,并能够适应不同的需求和平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒足饭饱抡大锤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值