qt&python混合编程

这篇具有很好参考价值的文章主要介绍了qt&python混合编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考:Qt调用Python详细过程_贝勒里恩的博客-CSDN博客_qt python

1.环境搭建

1.1.python3.6 32bits

1.2.qt5.12.12 32bits

说明:

(1).务必保持版本位数一致,没有一致就得重新下载一致的版本

(2).以上软件环境的下载和安装,请自行百度,资料很多,在此重点说说混合编程遇到的错误如何解决.

(3).请装完软件后一定要试一试是否能够正常运行

2.创建工程

2.1.创建qt工程

注意:选择编译器时必须选择和版本对应位数的编译器!如我是用32bits的则我选择的编译器是

qt&python混合编程

qt&python混合编程

2.2.在qt项目中添加py文件

 qt&python混合编程

 2.3.编辑py文件,写入代码:qt&python混合编程

2.4. 双击.pro文件,添加Python的头文件和库文件

qt&python混合编程

INCLUDEPATH += C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\include
LIBS += -LC:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\libs -lpython36
LIBS += -LC:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\libs -lpython36_d
#注意:-L 和 PATH 之间不能有空格

 说明:

(1).请按照个人自己安装的路径作修改

(2)."python36_d.lib"文件是为了qt在debug模式下用的,且这个文件在...Python\Python36-32\libs文件夹中并没有,是我复制了一份python36.lib文件后重命名得到的,如果没有这个文件debug模式下编译会出错

3.功能代码编写

3.1."mainwindow.h"内容

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <Python.h>
#include <iostream>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

3.2."mainwindow.cpp"内容

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Py_Initialize();
    if( !Py_IsInitialized() )
        qDebug()<<"Py_Initialize fail";
    else
        qDebug()<<"Py_Initialize pass";

    //导入sys模块设置模块地址
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
    //QString setSysPath = QString("sys.path.append('%1')").arg(QCoreApplication::applicationDirPath());
    //PyRun_SimpleString(setSysPath.toStdString().c_str());

    //创建模块指针
    PyObject* pModule = PyImport_ImportModule("Py_Module");
    if (!pModule)
        qDebug()<<"pModule fail";

    //创建函数指针
    PyObject* pFunc= PyObject_GetAttrString(pModule,"add");
    if(!pFunc)
        qDebug()<<"pFunc fail";

    //创建函数参数,方法1
    PyObject* pPara = PyTuple_New(2);        // 2个参数
    PyTuple_SetItem(pPara, 0, Py_BuildValue("i",1));  //参数1为int型 1
    PyTuple_SetItem(pPara, 1, Py_BuildValue("i",2));  //参数2为int型 2

    //创建函数参数,方法2
    PyObject* args = PyTuple_New(2);        // 2个参数
    PyObject* arg1 = PyLong_FromLong(4);    // 参数一设为4
    PyObject* arg2 = PyLong_FromLong(3);    // 参数二设为3
    PyTuple_SetItem(args, 0, arg1);
    PyTuple_SetItem(args, 1, arg2);

    //调用Python函数,传入元组参数pPara
    PyObject *FuncBack = PyObject_CallObject(pFunc,pPara);
    //PyObject_CallObject(pFunc,nullptr); //无参数调用

    //FuncBack是返回值指针,转换获取返回值
    int res = 0;
    PyArg_Parse(FuncBack,"i",&res);
    qDebug()<<"return: "<<res;

    //调用结束,销毁
    Py_Finalize();
}

MainWindow::~MainWindow()
{
    delete ui;
}

4.编译

        会出现以下报错:

4.1.

错误1:找不到Python.h

出现原因: 因为我们在c++中使用这个了头文件,因此出现了找不到python.h
解决办法: 在.pro文件中添加python的头文件以及静态链接库,参考:2.4的内容

错误2

PyType_Slot *slots; object.h(445) : error C2059: 语法错误:“;”
object.h(445) : error C2238: 意外的标记位于“;”之前

解决办法:把slots改成slots1,Python将slots作为变量,而Qt将slots作为关键字,所以冲突了,再次编译该问题就没有了

错误3
qt&python混合编程

解决办法:简单粗暴,直接注释掉

 错误4:

报错信息:

Fatal Python error: Py_Initialize: unable to load the file system codec

ModuleNotFoundError: No module named 'encodings' 

 解决办法:

开发模式下将python目录下的Lib文件夹复制到debug/release目录下;生成exe后将Lib文件夹复制到同级目录下就可以了,这样就完全脱离了python的环境。

错误5:

报错信息:运行时闪退

        这是可能是因为代码执行时产生了异常而终止,如获取模块指针失败就会闪退,请将将工程下的Py_Module.py复制到构建目录下的debug文件夹中,这样EXE文件在执行时才找得到模块. 

其它解决办法:qt编译之后的闪退可能是python36.dll没有放到debug/release目录下

5.运行

本人已经完全执行成功了,并得到了正确结果.

 qt&python混合编程

 文章来源地址https://www.toymoban.com/news/detail-461400.html

到了这里,关于qt&python混合编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt之qml和widget混合编程调用

    首先是创建一个widget项目 然后需要添加qml和quick的插件使用 QT += quickwidgets qml 接着要在界面上创建一个quickwidget和按钮 创建一个c++对象类 QObjectQml cpp实现文件 注册c++对象到系统中 接着c++的界面对象中调用即可 qml文件的实现如下: 运行结果如下:

    2024年02月14日
    浏览(28)
  • c++Qt Creator调用 python 完整版 + 解决bug过程

    文章首发于我的个人博客:欢迎大佬们来逛逛 选择创建 qmake 项目: 选择创建 MSVC 64bit 版本:(选择Mingw可能会出错) 首先我们先创建一个普通的 python文件 : 💡 注意文件名不要是 test.py ,因为python中存在一个此文件,会产生冲突 输入以下内容用于测试python及 常用库的导入

    2024年02月03日
    浏览(29)
  • 混合编程python与C++

    上个版本: 只是用到ctypes进行传输, 这次将python服务端更改为C++服务端,方便后续维护. 本文实现功能: python传输图片给C++, C++接受图片后对图片进行处理,并将结果返回给python客户端, pass image from python to C++ 注意文中的model 部分有删减,createJson可参考使用,利用json来传递值 其实这个

    2024年02月08日
    浏览(33)
  • Python 和 C++ 混合编程:pybind11 使用

    我们通常在 Python 上进行算法开发,因为 Python 编程方便,易于快速验证算法。而在验证算法正确后,如果对运行效率有更高要求的话,则会将计算密集的模块使用 C/C++ 重新实现,来达到代码运行效率加速的效果。所以,这就涉及到了 Python 和 C++ 混合编程,而在这方面 pybin

    2024年02月08日
    浏览(32)
  • C++ 混合Python编程 及 Visual Studio配置

    接手了一个C++应用程序,解析csv和生成csv文件,但是如果要把多个csv文件合并成一个Excel,分布在不同的Sheet中,又想在一次运行中完成,不想说运行完C++ 的App后,再调用一个Python脚本或程序,这需要两步操作 根据安装的Visual Studio 的版本,我安装的是64-bit的。 如何查看当前

    2024年02月13日
    浏览(32)
  • qt matlab 混合编程

    matlab 2021a qt 5.12.10 qt creator 4.13.1 opencv 4.3.0 eigen-3.4.0/eigen-3.4.0 以 aberr_analy1 的导出 dill 举例 命令行中输入:deploytool 2. 选择LIbrarycompiler 3type 选择c++ 4,选择相应的 5. 点击package  选择保存的路径即可 6.导出后: 只需要 下面这个文件里面的dll .h 和。Lib 文件 1.opencv +eigen-3.4.0+matlab

    2024年02月07日
    浏览(32)
  • QT Quick之quick与C++混合编程

            Qt quick能够生成非常绚丽界面,但有其局限性的,对于一些业务逻辑和复杂算法,比如低阶的网络编程如 QTcpSocket ,多线程,又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等,在 QML 中要么不可用,要么用起来不方便,所以就有了quick和C++混合编程的需求。

    2024年02月12日
    浏览(30)
  • 【QT进阶】Qt Web混合编程之html、 js的简单交互

    往期回顾 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用(图文并茂超详细介绍)-CSDN博客 【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客 【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView(图文并茂超详细版本)-CSDN博客【QT进阶】Qt Web混合编程之VS2019 CEF的编译

    2024年04月22日
    浏览(23)
  • win11 python 调用edge调试过程

    1、下载对应版本的驱动程序: https://developer.microsoft.com/zh-cn/microsoft-edge/tools/webdriver/ 2、和系统版本对应的exe文件(x86、x64要对应)放置的固定的目录,我放到了system32下了; 3、PATH路径添加windows/system32目录; 4、确认安装的selenium的版本要在4.0以上,否则的话不能正常调用; p

    2024年02月12日
    浏览(29)
  • python隐藏源码,生成pyd文件并调用的完整过程

    我们知道​ ​windows 系统有许多 DLL 后缀的文件,即动态链接库,在运行时链接到调用程序​​。在运行时链接到 DLL 之类的库的主要优点是,它可以促进代码重用,模块化体系结构和更快的程序启动。结果,DLL 在 Windows 操作系统周围提供了许多功能。​​pyd 这个 d 就是取自

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包