2016-02-28 65 views
1

我在Visual Studio 2013中运行了一个模拟程序,我想要一个简单的GUI来输出/输入数据。在Qt中断中使用信号DLL

由于我知道一些Qt,我决定在Qt Creator中编写一个小Qt5程序,将其构建为.dll并将其链接到我的程序中。程序然后调用一个初始化函数来启动GUI。

总的来说,这个效果很好。 GUI的工作原理就像独立的Qt程序一样。但是,一旦我添加了一个自定义的信号,我的Qt .dll文件是这样的:

//File.h 
class MainGui : public QMainWindow 
{ 
    Q_OBJECT 

public: 

    explicit MainGui(QWidget *parent = 0); 
    ~MainGui(); 

signals: 
    void addItemSignal(QGraphicsView* it); 

private slots: 
    void addItemImpl(QGraphicsView* it); 

private: 
    Ui::MainGui *ui; 
}; 

//File.cpp 
void MainGui::addItemImpl(QGraphicsView *it) 
{ 
    //do anything 
} 

MainGui::MainGui(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainGui) 
{ 
    QObject::connect(this, &MainGui::addItemSignal, 
        this, &MainGui::addItemImpl); 
} 

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

最后我想开始我的主要程序时收到以下错误信息:

The procedure entry point could not be located in the dynamic link library e:\...\...\MyQtLibrary.dll. 

两者之间的空间“点”和“可能”并不是一个错误 - 看起来,由于某种原因,切入点根本不是任何事情。

经过一些测试,我发现问题在于在信号中使用Qt类。以下工作正常:

//File.h 
class MainGui : public QMainWindow 
{ 
    Q_OBJECT 

public: 

    explicit MainGui(QWidget *parent = 0); 
    ~MainGui(); 

signals: 
    void addItemSignal(void* it); 

private slots: 
    void addItemImpl(void* it); 

private: 
    Ui::MainGui *ui; 
}; 

//File.cpp 
void MainGui::addItemImpl(void*it) 
{ 
    //do anything 
} 

MainGui::MainGui(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainGui) 
{ 
    QObject::connect(this, &MainGui::addItemSignal, 
        this, &MainGui::addItemImpl); 
} 

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

这不仅影响到自定义信号,但内置辈:

QObject::connect(models, &QStandardItemModel::dataChanged,[this](a b, x y){ 
     //do something 
    }); 

这打破.dll文件也是如此。

我也注意到我不得不彻底重建Qt Creator中的.dll来解决这个问题。消除任何有问题的信号,只是建设并没有解决这个问题。

错误只发生在Debug配置中的Qt .dll中。发布配置运行良好。 MSVC程序是调试还是发布似乎没有效果。我没有改变任何一种配置的默认设置(除了一些与它无关的事情之外)。

我Qt Creator中发现两个配置之间唯一的区别是qmake的的呼叫:

qmake.exe "D:\Dev\Qt Workspace\ArduGui\ArduGui.pro" -r -spec win32-msvc2013 "CONFIG+=debug" "CONFIG+=qml_debug" 

这是该呼叫的调试配置。在Release中,缺少两个调试配置标志。但是当我混淆了qmake参数时,结果并没有改变。无论是否存在CONFIG+=debugCONFIG+=qml_debug,调试配置都会导致入口点错误。同样,即使添加了两个标志,Release也会一直工作。

所以在这一点上,我跑在墙上。有没有人有这方面的经验或可以建议如何调试问题的选项?

一些更多的信息:

我使用的是Windows 10,MSVC 2013和Qt Creator 3.6使用Qt 5.5.1。使用MSVC++ 12.0编译器通过各自的IDE编译.exe和.dll文件。

回答

0

如果它正常工作与void*但不与QT类指针作为参数传递的工作,我想你还没有注册类能在信号使用它/ slot机制:

qRegisterMetaType<QGraphicsView *>("QGraphicsView*"); 

请务必在第一次使用此信号之前调用此功能。 虽然我不确定这是你所有问题的原因。

+0

QGraphicsView是一个标准的Qt类。据我所知,我只需要以这种方式注册定制课程。 (我从来不需要在任何其他项目中使用内置类。) – s3rius