1. 程式人生 > >非Qt工程使用Qt的信號槽機制

非Qt工程使用Qt的信號槽機制

pragma argv get ber tar 版本 信號槽 class .lib

非Qt工程,使用Qt的信號槽機制,蛋疼不?反正我現在就是要做這樣一件蛋疼的事。

要使用Qt的信號槽機制,下面是從Qt Assist裏面關於 signal & slots 的一句介紹:

All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also derive (directly or indirectly) from QObject.

翻譯過來就是:所有包含信號與槽的類,必須引用 Q_OBJECT這個宏,然後需要從QObject繼承過來。

這樣得到我們要做事情的前2個步驟:
1. 從QObject繼承。
2. 類中引用 Q_OBJECT這個宏。
我打算在A類裏面發出一個信號,然後讓B類接收。

//A.h的內容
#pragma once

#include <QtCore/QObject>

class A :public QObject
{
    Q_OBJECT
public:
    void sendA() { emit signalA(999);}
signals:
    void signalA(int);
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
//B.h 的內容
#pragma once
#include <QtCore\QObject>

class B : public QObject
{
    Q_OBJECT
public:
    B() : _receiveData(0)
    {

    }
public slots:
        void receiveA(int v)
        {
            _receiveData = v;
        }
public:
    int _receiveData;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

做完這兩件事情之後,編譯不通過啊,怎麽辦?關於頭文件,LIB文件的包含,這裏不講了。
這裏引用到了QtCore/QObject這個頭文件, Qt5Cored.lib(根據版本不同,名稱不一樣)這個庫。

  1. 由於Q_OBJECT這個宏是由moc來處理的,還需要使用moc對我們的頭文件進行編譯。由於不是Qt工程,所以這個編譯需要手動設置一下,具體參考下面
    http://blog.csdn.net/xiaofengkuang/article/details/9999147
    使用moc編譯完了之後,然後再講moc_A.cpp, moc_B.cpp添加到工程中來即可。

測試代碼:

#include "A.h"
#include "B.h"
#include <assert.h>

#include <QtCore/QObject>

int main(int argc, char **argv)
{
    A a;
    B b;
    QObject::connect(&a, SIGNAL(signalA(int)), &b, SLOT(receiveA(int)));
    a.sendA();
    int data = b._receiveData;
    assert(data == 999);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

測試通過。

所以,總結一下非Qt工程,使用Qt的信號槽的步驟:
1. 繼承自QObject
2. 引用Q_OBJECT宏
3. 使用Qt的moc編譯頭文件,並將編譯完成之後的moc_*.cpp文件添加到工程中來。
當然,這過程中,你引用到的Qt頭文件,lib文件,都需要你手動指定好路徑和依賴庫。

https://blog.csdn.net/snail_hunan/article/details/48634427

非Qt工程使用Qt的信號槽機制