2016-02-28 100 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