我有一个使用QPluginLoader工具加载插件(.dll / .so)的C ++ / Qt应用程序。这个插件基本上是一个嵌入式的python解释器,它允许通过PyQt4模块检查主应用程序中的Qt对象。
问题是即使从C ++应用程序创建了QCoreApplication实例,从插入的python解释器执行的命令PyQt4.QtCore.QCoreApplication.instance()仍返回None。
仅在调试模式下的Windows上。
在linux上或在Windows上的发布模式下,命令PyQt4.QtCore.QCoreApplication.instance()正确返回由C ++应用程序创建的QCoreApplication实例。
以下是一些显示问题的极简代码。
在发布模式下编译时:
$ ./a.out
1+1
2
import PyQt4
import PyQt4.QtCore
PyQt4.QtCore.QCoreApplication.instance()
<PyQt4.QtCore.QCoreApplication object at 0x00C69198>
=>好吧
在调试模式下编译时:
$ ./a.out
import PyQt4
import PyQt4.QtCore
PyQt4.QtCore.QCoreApplication.instance()
=>不好(未返回)
文件main.cpp
#include <QCoreApplication>
#include <QPluginLoader>
#include <QDebug>
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
QPluginLoader loader("plugin.dll");
loader.setLoadHints(QLibrary::ResolveAllSymbolsHint | QLibrary::ExportExternalSymbolsHint);
loader.load();
if(!loader.isLoaded()) {
qDebug() << loader.errorString();
return 1;
}
(void)loader.instance();
return app.exec();
}
文件plugin.h
#ifndef PLUGIN_H
#define PLUGIN_H
#include <QObject>
#include <Python.h>
class Plugin : public QObject
{
public:
Plugin();
~Plugin();
private:
PyThreadState *m_ts;
};
class InterpInput : public QObject
{
Q_OBJECT
public:
InterpInput(QObject *parent = 0) : QObject(parent) { }
public slots:
void monitorInput();
signals:
void done();
void inputReady();
};
class InterpOutput : public QObject
{
Q_OBJECT
public:
InterpOutput(QObject *parent = 0) : QObject(parent) { }
public slots:
void processLine();
public:
PyThreadState *m_ts;
};
#endif
文件plugin.cpp
#include "plugin.h"
#include <QCoreApplication>
#include <QThread>
#include <QtPlugin>
#include <QPluginLoader>
Q_EXPORT_PLUGIN2(Plugin, Plugin)
回首忆惘然
有只小跳蛙
相关分类