Почему qt не может просто вызвать скрипт python для реализации чертежа?
Моя версия Qt 5.13, версия Python 3.7. Они 32 бита. И у меня есть код Python myDemo.py, чтобы нарисовать ломаную линию. когда я запускаю его на питоне, он может показывать полилинию. Однако , я через qt вызывал скрипт python, он ничего не показывал.
Я обнаружил, что Qt может вызывать скрипт python с классом PyObject. Я много пробовал и решаю много проблем. Но моя программа не сообщала об ошибках, когда она запускалась, она входила в программу python, но не показывала ломаную линию.
import matplotlib.pyplot as plt
import numpy as np
def getPic(str):
print ('enter getPic...', str)
x = np.arange(9)
y = np.sin(x)
z = np.cos(x)
# marker数据点样式,linewidth线宽,linestyle线型样式,color颜色
plt.plot(x, y, marker="*", linewidth=3, linestyle="--", color="orange")
plt.plot(x, z)
plt.title("matplotlib")
plt.xlabel("height")
plt.ylabel("width")
# 设置图例
plt.legend(["Y","Z"], loc="upper right")
plt.grid(True)
plt.show()
#include <QApplication>
#include <QDebug>
#pragma push_macro("slots")
#undef slots
#include <Python.h>
#pragma pop_macro("slots")
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// ONETEST w;
// w.show();
//进行初始化
Py_Initialize();
#if 1
//如果初始化失败,返回
if(!Py_IsInitialized())
{
qDebug()<<"initial failure!";
return a.exec();
}
//加载模块,模块名称为myDemo,就是myDemo.py文件
PyObject *pModule = PyImport_ImportModule("myDemo");
//如果加载失败,则返回
if(!pModule)
{
qDebug()<<"load failure";
return a.exec();
}
//加载函数getPic
PyObject* pDict = PyModule_GetDict(pModule);
PyObject* pFunc = PyDict_GetItemString(pDict, "getPic"); //从字典属性中获取函数
if(pFunc && PyCallable_Check(pFunc))
{
//调用函数
PyObject* pArg = Py_BuildValue("(s)", "getPic"); //参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档
PyEval_CallObject(pFunc, pArg); //调用直接获得的函数,并传递参数
QTime _Timer = QTime::currentTime().addMSecs(5000);
while( QTime::currentTime() < _Timer )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
//如果失败则返回
else
{
qDebug()<<"load function failure";
return a.exec();
}
#elif
PyObject* pDict = PyModule_GetDict(pModule);
PyObject* pFunc = PyDict_GetItemString(pDict, "add"); //从字典属性中获取函数
PyObject* pArg = Py_BuildValue("(i, i)", 1, 2); //参数类型转换,传递两个整型参数
PyObject* result = PyEval_CallObject(pFunc, pArg); //调用函数,并得到python类型的返回值
int sum;
PyArg_Parse(result, "i", &sum); //将python类型的返回值转换为c/c++类型
qDebug()<<"sum = "<<sum;
#elif
PyRun_SimpleString("print('hello world!')");
PyRun_SimpleString("getPic();");
#endif
//退出
Py_Finalize();
return a.exec();
}
Честно говоря, я просто не знаю, каков реальный результат. Я просто хочу понять, почему он не показывает полилинии.