GSE_ 2022-07-29 11:32 采纳率: 72.7%
浏览 34

Qt中调用Python的异常

**问题遇到的现象和发生背景 **
Qt 5.15.2 + Python 3.8
使用Python/C API实现C++和Python间的交互
问题相关代码
Main.cpp:

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

#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    //show the UI
    w.show();
    return a.exec();
}


MainWindow.cpp:

#include <Python.h>

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

#include <QAction>
#include <QPushButton>
#include <QLineEdit>
#include <QByteArray>
#include <QLabel>
#include <QString>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //num init
    char *num1, *num2;

    //Python config

    //Python init
    Py_Initialize();  //init the python interpreter
    if(!Py_IsInitialized())  //succeed or not
    {
        qDebug() << "Python init failed.";
    }
    //add path into sys
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.insert(0,'.')");
    //PyObject_init
    PyObject *module;  // module and func
    module = PyImport_ImportModule("MathPy");  //import module

    //Menubar -> exit
    connect(ui->actionexit,&QAction::triggered,this,[=](){
        Py_Finalize();
        this->close();
    });

    //num -> change
    connect(ui->EditNum1,&QLineEdit::textChanged,this,[&](){
        num1 = ui->EditNum1->text().toUtf8().data();
    });
    connect(ui->EditNum2,&QLineEdit::textChanged,this,[&](){
        num1 = ui->EditNum2->text().toUtf8().data();
    });

    //six buttons
    connect(ui->ButtonPlus,&QPushButton::clicked,this,[&](){
        PyObject *func = PyObject_GetAttrString(module,"plus");
        PyObject *result = PyObject_CallFunction(func,num1,num2);
        int res = PyLong_AsLong(result);
        ui->LabelResult->setText(QString(res));
    });
    connect(ui->ButtonSub,&QPushButton::clicked,this,[&](){
        PyObject *func = PyObject_GetAttrString(module,"sub");
        PyObject *result = PyObject_CallFunction(func,num1,num2);
        int res = PyLong_AsLong(result);
        ui->LabelResult->setText(QString(res));
    });
    connect(ui->ButtonMulti,&QPushButton::clicked,this,[&](){
        PyObject *func = PyObject_GetAttrString(module,"multi");
        PyObject *result = PyObject_CallFunction(func,num1,num2);
        int res = PyLong_AsLong(result);
        ui->LabelResult->setText(QString(res));
    });
    connect(ui->ButtonDiv,&QPushButton::clicked,this,[&](){
        PyObject *func = PyObject_GetAttrString(module,"div");
        PyObject *result = PyObject_CallFunction(func,num1,num2);
        int res = PyLong_AsLong(result);
        ui->LabelResult->setText(QString(res));
    });
    connect(ui->ButtonMax,&QPushButton::clicked,this,[&](){
        PyObject *func = PyObject_GetAttrString(module,"max");
        PyObject *result = PyObject_CallFunction(func,num1,num2);
        int res = PyLong_AsLong(result);
        ui->LabelResult->setText(QString(res));
    });
    connect(ui->ButtonMin,&QPushButton::clicked,this,[&](){
        PyObject *func = PyObject_GetAttrString(module,"min");
        PyObject *result = PyObject_CallFunction(func,num1,num2);
        int res = PyLong_AsLong(result);
        ui->LabelResult->setText(QString(res));
    });

}

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


MathPy.py


def plus(num1,num2):
    return num1+num2

def sub(num1,num2):
    return num1-num2

def multi(num1,num2):
    return num1*num2

def div(num1,num2):
    return num1/num2

def max(num1,num2):
    if num1>num2:
        return num1
    else:
        return num2

def min(num1,num2):
    if num1>num2:
        return num2
    else:
        return num1

ui有两个QLineEdit,分别输入两个数字,6个QPushButton分别对应MathPy.py中的六个函数,一个QLabel显示结果
运行结果及报错内容
程序可以运行

img

但是点击按钮的的时候,会在应用程序输出栏输出电脑上某输入法的路径(莫名其妙),然后程序crash

** 我的解答思路和尝试过的方法 **
不知道为什么会出现这种错误,无从下手

我想要达到的结果
程序实现应有功能,正常运行

  • 写回答

1条回答 默认 最新

  • 加油吧,小杜 2022-07-29 14:55
    关注

    那你还不如直接用python,python有个模块叫pyqt,可以直接使用qt,非常方便

    评论

报告相同问题?

问题事件

  • 创建了问题 7月29日

悬赏问题

  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 vue2登录调用后端接口如何实现