2016-09-05 81 views
0

對於所有人來說都是美好的一天,無論誰看到我的問題。 我有一個dll,它是用C++和一些GUI QT項目編寫的。調用時DLL函數將在這個週期包:C++ dll和QT GUI之間的通信

for (int offset = 0; offset < filelen; offset += 4) 
{ 
    for (int i = 0; i < 4 ; i++) 
    { 
     FPGA_Packet.DATA[i] = (program_data[i + offset]; 
    } 
    if (SOCKET_ERROR == (send(mysocket, (char*)&FPGA_Packet, 8, 0))) 
    { 
     error = WSAGetLastError(); 
     return error; 
    } 
} 

的問題是,我需要通過進度偏移每次遞增,當我打電話「發送」功能。問題是 - 我如何建立GUI和DLL之間的連接?我必須使用插槽和信號,或者我可以用「連接」線程功能解決它,或者有更簡單或更難的選擇?我需要給DLL指針的形式,或以某種方式使用get/set?我會appretiate任何建議,鏈接,例子和所有其他幫助。謝謝。

回答

0

你必須從你的函數發出一個信號(或者如果我們正在討論MVC模式實現,最好說一個模型),並在視圖類中捕獲它。下面是該代碼段(我使用QML的GUI開發,但這個想法必須明確無論如何):

QObject * const callViewObject = getView()->getSlotsSignalsObject(); 

    bool isSlotSignalConnected = false; 

    isSlotSignalConnected = QObject::connect(this, 
              SIGNAL(clearViewSignal()), 
              callViewObject, 
              SLOT(clearViewSlot())); 

其中,getView() - > getSlotsSignalsObject()中是這樣實現的:

QObject * const QmlViewBase::getSlotsSignalsObject() const 
{ 
    return reinterpret_cast<QObject* const >(m_declarativeView->rootObject()); 
} 

要聲明,你必須使用下面的定義在類的信號:

signals: 

    void clearView(); 

不要忘記,如果你的類使用信號槽功能,您必須把Q_OBJECT裏面的宏。

+0

Q_OBJECT必須在dll中添加嗎?我必須創建非QT DLL,我試圖避免包括QT模塊。或者我誤解了你,GUI程序中的QObject聲明足以使用插槽信號? –

+0

你可以用Q_Object宏創建一個dll封裝器。沒有這個聲明,沒有機會使用信號插槽機制 – Dmitry

+0

噢,好吧...我想我只需要添加QT支持到我的dll。試圖避免這一點,但如果沒有其他選擇 - 我必須這樣做。感謝您的幫助 –