我在Visual Studio 2013中运行一个模拟程序,我想要一个简单的GUI来输出/输入数据。
由于我知道一些Qt,我决定用Qt Creator编写一个小的Qt5程序,将其构建为.dll并将此.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才能解决问题。删除任何有问题的信号并仅构建并不能解决问题。
仅当 Qt .dll内置于调试配置中时,才会发生此错误。发布配置运行良好。无论 MSVC 程序是调试还是发布似乎都没有效果。我没有更改这些配置中的任何一个的任何默认设置(除了一些绝对与它无关的事情)。
我在Qt Creator中发现两种配置之间的唯一区别是qmake的调用:
qmake.exe "D:DevQt WorkspaceArduGuiArduGui.pro" -r -spec win32-msvc2013 "CONFIG+=debug" "CONFIG+=qml_debug"
这是对调试配置的调用。在"发布"中,缺少两个调试配置标志。但是当我弄乱 qmake 参数时,结果并没有改变。调试配置将始终导致入口点错误,无论是否存在CONFIG+=debug
或CONFIG+=qml_debug
。同样,即使添加了两个标志,发布也将始终有效。
所以此时我正碰壁。是否有人对此有经验或可以建议有关如何调试问题的选项?
更多信息:
我使用的是Windows 10,MSVC 2013和Qt Creator 3.6以及Qt 5.5.1。.exe和.dll都是通过各自的 IDE 使用 MSVC++ 12.0 编译器编译的。
如果它适用于void*
但不适用于作为参数传递的 QT 类指针,我想您尚未注册该类以便能够在信号/插槽机制中使用它:
qRegisterMetaType<QGraphicsView *>("QGraphicsView*");
请务必在首次使用此信号之前调用此函数。虽然我不确定这是您所有问题的原因。