目录:

1.从Qt中调用py脚本里的一个无参函数,功能:打印"hello python"

  a)相关配置

  b)踩过的一些坑

2.从Qt中调用py脚本里的一个有参函数并接收返回值 ,功能:实现 return a+b

3.从py中读取csv文件,并进行一些切片分类处理

4.在py中编写K近邻算法

 

 

正文:

1.首先在Qt中创建一个Qt Widgets Application(当然其他的也行)

python 嵌入到qt中 python调用qt_python 嵌入到qt中

 

我电脑里面的是python35,64位的,所以要用64位去编译它,不然会出错。

这里我用的是

python 嵌入到qt中 python调用qt_数据结构与算法_02

 

2.然后在项目中添加一个python文件

 

python 嵌入到qt中 python调用qt_python_03

 

 最后结构目录如下:

python 嵌入到qt中 python调用qt_python_04

 

修改python和c++文件



#!/usr/bin/env python
# -*- coding: utf-8 -*-
#coding=UTF8
def hello():
    print("Hello Python")



 

修改mian.cpp



#include "mainwindow.h"
#include <QApplication>
#include <Python.h>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
//    MainWindow w;
//    w.show();
    Py_Initialize();//初始化py模块
    if ( !Py_IsInitialized() )
    {
    return -1;
    }
    PyRun_SimpleString("import sys");//设置py脚本的路径
    PyRun_SimpleString("sys.path.append('./')");//当前路径
    PyObject* pModule = PyImport_ImportModule("test_py");  // 这里的test_py就是创建的python文件
    if (!pModule) {
            qDebug()<< "Cant open python file!\n";
            return -1;
        }
    PyObject* pFunhello= PyObject_GetAttrString(pModule,"func2");  // 这里的hello就是python文件定义的函数
    if(!pFunhello){
         qDebug()<<"Get function hello failed";
         return -1;
     }
    PyObject_CallFunction(pFunhello,nullptr);//调用hello函数
     Py_Finalize();//释放py模块


    return a.exec();



 

3.运行程序

qmake 然后构建 最后运行

错误1:找不到 python.h

python 嵌入到qt中 python调用qt_数据结构与算法_05

 

出错原因:我们在qt中调用了Python.h,但是没有添加python的相应动态链接库

 解决办法:在.pro工程文件中添加相应的头文件和库文件

 

python 嵌入到qt中 python调用qt_数据结构与算法_06



INCLUDEPATH += D:/Python/include
LIBS += -LD:/Python/libs/
    -l_tkinter/
    -lpython3/
    -lpython35



python 嵌入到qt中 python调用qt_数据结构与算法_07

 

 注意:1)这路径是你自己电脑里装python的文件路径

    2)-L 和-l(这里是小写的L)后面直接跟路径和文件名,不能有空格,不然会报错,LNK1146: 没有用选项“/LIBPATH:”指定的参数

 

 

错误2: error: C2238: 意外的标记位于“;”之前

python 嵌入到qt中 python调用qt_python 嵌入到qt中_08

出现原因:由于QT中定义了slots作为关键了,而python3中有使用slot作为变量,所以有冲突 解决方法:在python的object.h中 slots冲突,因此修改object.h,我的object.h路径:D:\Python\include\object.h

python 嵌入到qt中 python调用qt_Python_09

 

 然后保存qmake 构建 运行

出现错误: error: LNK1104: 无法打开文件“python35_d.lib

问题: 无法打开 python36_d.lib 的问题 解决: Anaconda3 的 pyconfig.h 文件中做出修改。 我的pyconfig.h路径:D:\Python\include\pyconfig.h

将315行的,python36_d.lib改成python36.lib

python 嵌入到qt中 python调用qt_python 嵌入到qt中_10

同时注释359行

python 嵌入到qt中 python调用qt_Python_11

 

噢,对了,因为我在前面设置加载py是 ''./''所以是在当前文件夹下面

需要在项目中取消Shadow bulid的勾选,让debug文件在当前文件夹下,养成这个好习惯,不然以后老是会出现找不到xxxx而出错

python 嵌入到qt中 python调用qt_数据结构与算法_12

 

 

  

OK,然后在qmake 编译 运行

  

python 嵌入到qt中 python调用qt_Python_13