You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.4 KiB
4.4 KiB
title | date | author | top | cover | toc | mathjax | summary | tags | categories | abbrlink | reprintPolicy | coverImg | img | password |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
QT调用python代码 | 2022年4月28日 | TianZD | true | true | true | false | 在QT Creator中调用python代码 | [QT 编程] | [编程 QT] | c4a1e2a7 | cc_by | <nil> | <nil> | <nil> |
[toc]
QT调用Python
前言
QT上位机程序和python程序交互:
- QT调用python代码
- QT和python通过数据库交互
- QT和python通过网络编程交互
环境
电脑:windows11
Anaconda中的opencv虚拟环境,python版本:3.9.7
Anaconda路径:C:\ProgramData\Anaconda3
虚拟环境路径:C:\Users\12038\.conda\envs\opencv\
配置
QT添加python库文件
在pro文件中添加
INCLUDEPATH +=C:\Users\12038\.conda\envs\opencv\include ############# python enviroment
LIBS += -LC:\Users\12038\.conda\envs\opencv\libs\
-l_tkinter\
-lpython3\
-lpython39
python路径\include
python路径\libs
添加python文件
右键QT项目文件,新建python文件
编写python代码,这里为test1.py
# This Python file uses the following encoding: utf-8
# if __name__ == "__main__":
# pass
def hello():
print("hello world!")
QT调用
#include <QCoreApplication>
#include <Python.h> //添加python
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Py_Initialize(); //初始化
if ( !Py_IsInitialized() )
{
return -1;
}
PyObject* pModule = PyImport_ImportModule("test1"); // 这里的test1就是创建的python文件
if (!pModule) {
cout<< "Cant open python file!\n" << endl;
return -1;
}
PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello"); // 这里的hellow就是python文件定义的函数
if(!pFunhello){
cout<<"Get function hello failed"<<endl;
return -1;
}
PyObject_CallFunction(pFunhello,NULL); //调用hello函数
Py_Finalize(); //释放
return a.exec();
}
遇到的问题
https://blog.csdn.net/alxe_made/article/details/83382159
error: C2238: 意外的标记位于“;”之前
出现的原因:
由于QT中定义了slots作为关键了,而python3中有使用slot作为变量,所以有冲突
解决方法:
在python的object.h中 slots冲突,因此修改object.h
C:\Users\12038\.conda\envs\opencv\include\object.h
在PyType_Slot *slots;
上下加上两句代码,如下
typedef struct{
const char* name;
int basicsize;
int itemsize;
unsigned int flags;
#undef slots //取消宏定义
PyType_Slot *slots; /* terminated by slot==0. */
#define slots Q_SLOTS
} PyType_Spec;
无法打开python39_d.lib
修改C:\Users\12038\.conda\envs\opencv\include\pyconfig.h
文件,将python39_d.lib
改为python39.lib
#ifdef MS_COREDLL
# if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
/* not building the core - must be an ext */
# if defined(_MSC_VER)
/* So MSVC users need not specify the .lib
file in their Makefile (other compilers are
generally taken care of by distutils.) */
# if defined(_DEBUG)
# pragma comment(lib,"python39.lib") //修改后
// # pragma comment(lib,"python39_d.lib") //修改前
# elif defined(Py_LIMITED_API)
# pragma comment(lib,"python3.lib")
# else
# pragma comment(lib,"python39.lib")
# endif /* _DEBUG */
# endif /* _MSC_VER */
# endif /* Py_BUILD_CORE */
#endif /* MS_COREDLL */
error: failed to get the Python codec of the filesystem encoding
https://blog.csdn.net/qq_43302566/article/details/121537908
PYTHONHOME 和 PYTHONPATH 找不到路径,其实类似于JAVA的环境变量
出现这种原因,我的是因为用了Anaconda的python!!!
把PYTHONHOME 和 PYTHONPATH改成conda的目录即可!
Cant open python file!
把python文件手动复制到QT debug文件夹下