Boost :: Python和Qt - QImage赋值运算符 - DLL加载失败

时间:2014-03-22 01:35:23

标签: python c++ qt boost

我正在尝试使用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)解决了这个问题。

0 个答案:

没有答案