我正在尝试使用boost :: python将QCustomPlot链接到PyQt4应用程序。我不需要在python中做任何事情,QCustomPlot只传递数据用于显示/交互。这意味着C ++和python之间没有信号/插槽。除了将QCustomPlot小部件添加到PyQt应用程序并接收数据之外,这两个部分是独立的。
问题是我收到了#34; ImportError:DLL加载失败:找不到指定的过程。"当我尝试导入包含QCustomPlot的已编译的C ++ pyd(dll)文件时。我也试过使用sip(qcustomplot_python)以及相同的结果。
经过一些调查后,我能够在一个简短的代码示例中重新创建错误。首先定义要用于在Python和C ++(Interface.h)之间进行接口的类。
#ifndef INTERFACE_H
#define INTERFACE_H
#include <QWidget>
#include <QImage>
#include <QVBoxLayout>
#include <QLabel>
class Interface : public QWidget
{
Q_OBJECT
public:
Interface() {
img = QImage();
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(new QLabel("Hello World"));
this->setLayout(layout);
}
private:
QImage img;
};
#endif // INTERFACE_H
接下来定义boost :: python绑定(py_expose.cpp)。
#include <boost/python.hpp>
#include "Interface.h"
#include <QWidget>
long int unwrap(QObject* ptr) {
return reinterpret_cast<long int>(ptr);
}
template <typename T>
T* wrap(long int ptr) {
return reinterpret_cast<T*>(ptr);
}
BOOST_PYTHON_MODULE(QImage_interface)
{
boost::python::class_<QObject, QObject*, boost::noncopyable>("QObject", boost::python::no_init)
.def("unwrap", unwrap)
.def("wrap", boost::python::make_function( wrap<QObject>, boost::python::return_value_policy<boost::python::return_by_value>() ))
.staticmethod("wrap");
boost::python::class_<QWidget, boost::python::bases<QObject>, QWidget*, boost::noncopyable>("QWidget")
.def("wrap", boost::python::make_function( wrap<QWidget>, boost::python::return_value_policy<boost::python::return_by_value>() ))
.staticmethod("wrap");
boost::python::class_<Interface, boost::python::bases<QWidget>, Interface*, boost::noncopyable>("Interface")
.def("wrap", boost::python::make_function( wrap<Interface>, boost::python::return_value_policy<boost::python::return_by_value>() ))
.staticmethod("wrap");
}
现在运行python脚本。
from PyQt4 import QtGui, QtCore
import QImage_interface
import sip
def toQt(object, type):
ptr = object.unwrap()
return sip.wrapinstance(ptr, type)
def fromQt(object, type):
ptr = sip.unwrapinstance(object)
return type.wrap(ptr)
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.custom_plot = toQt(QImage_interface.Interface(), QtGui.QWidget)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.custom_plot)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
最后是QtCreator项目。
QT = core gui
TARGET = QImage_interface
TARGET_EXT = .pyd
TEMPLATE = lib
CONFIG += shared
HEADERS += \
Interface.h
SOURCES += \
py_expose.cpp
INCLUDEPATH += $$(BOOST_ROOT) $$(PYTHON_INCLUDE)
LIBS += -L$$(BOOST_ROOT)/lib32-msvc-10.0 -lboost_python-vc100-mt-gd-1_55 -lC:/Python27/libs/python27
我正在使用针对Qt 4.8.4和msvc-10.0(32位)构建的PyQt4。如果删除了行img = QImage();
,则DLL加载失败会消失,但这不是一个实际修复。
编辑:更新到Python 3.3和PyQt5.2.1(Qt 5.2.0)解决了这个问题。