2016-09-05 18 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パターンの実装について言えばモデルと言うよりも)、ビュークラスの中にキャッチしてください。ここでは、このためのコードスニペット(私が開発GUIのためのQMLを使用していますが、アイデアはとにかく明確でなければならない)である。

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(); 

は、あなたのクラスを使用すると、を置く必要があり、信号スロットの機能を利用した場合にそのことを忘れないでください。内部にマクロがあります。

+0

Q_OBJECTをdll内に追加する必要がありますか?私は非QTのDLLを作成する必要があります、私はQtのモジュールが含まれないようにしようとしています。それとも、GUIプログラム内のQObject宣言がスロット信号を使用するのに十分でしょうか? –

+0

内部にQ_Objectマクロを持つdllラッパーを作成できます。この宣言なしでシグナルスロットメカニズムを使用する機会はありません – Dmitry

+0

ああ...私はちょうど私のDLLにQTサポートを追加する必要がありますね。それを避けようとしましたが、もし他のオプションがなければ、私はそれをしなくてはなりません。助けてくれてありがとう –

関連する問題