目前,我正在使用Qt框架开发C ++ GUI应用程序。通常,此应用程序由用户鼠标/键盘输入驱动。但是,我们最近使用PyQt构建了一个python接口,因此用户可以使用简单的python脚本来驱动应用程序。这意味着我们必须在C ++应用程序中嵌入python解释器。为了初始化解释器,我们只需在设置主窗口然后调用Py_Finalize()之后在main.cpp函数中调用Py_Initialize();在程序退出之前。这似乎在Mac和Linux平台上都没有问题,但我似乎遇到了Windows上的问题。
在调用Py_Initialize()之后,用户可以打开文件浏览器来选择感兴趣的文件以读入程序。在代码中,我们使用QFileDialog :: getOpenFileName静态方法来允许用户选择他们的文件。但是,在Windows上,该程序正在崩溃。该程序看起来在python库中对PyDict_GetItem的调用时崩溃。
我创建了一个超级简单的Qt GUI程序,它也会出现同样的崩溃。本质上,该程序是一个基本的Qt GUI应用程序,在主窗口中间有一个按钮。按下按钮时,应出现文件对话框,但程序崩溃。代码的主要部分如下。
的main.cpp
#include "Python.h"
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
Py_Initialize();
int result = a.exec();
Py_Finalize();
return result;
}
mainwindow.h
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString defaultFileName = QString::fromStdString("file.txt");
QString getFileName = QFileDialog::getOpenFileName(this, "Load File", defaultFileName, "Files (*.txt *.csv)");
}
请注意,在按下程序中的唯一按钮后调用QFileDialog :: getOpenFileName时,程序会崩溃。
以下是一些可用于诊断问题的其他规范: