2016-09-05 54 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。试图避免这一点,但如果没有其他选择 - 我必须这样做。感谢您的帮助 –