QT:信號與槽

sender.h

#ifndef SENDER_H
#define SENDER_H
#include <QObject>

class Sender : public QObject
{
    Q_OBJECT
public:
    Sender();
signals:
    void send_msg();
    void send_msg(int x);
};
#endif // SENDER_H

receiver.h

#ifndef RECEIVER_H
#define RECEIVER_H
#include <qobject.h>
#include <stdio.h>
#include <iostream>

class Receiver : public QObject
{
    Q_OBJECT
public:
    Receiver();

public slots:
    void receive_msg()
    {
        std::cout  << "received msg without parameters" << std::endl;
    }

    void receive_msg(int x)
    {
        std::cout << "receive " << x << std::endl;
    }
};
#endif // RECEIVER_H

main.cpp

 Sender m_sender;
 Receiver m_receiver;

 QObject::connect(&m_sender,SIGNAL(send_msg()),&m_receiver,SLOT(receive_msg()));
 QObject::connect(&m_sender,SIGNAL(send_msg(int)),&m_receiver,SLOT(receive_msg(int)));

 m_sender.send_msg();
 m_sender.send_msg(3);

特別需要注意的是:

QT,類要支持信號與槽機制,需要繼承自QObject並在頭文件開頭添加Q_OBJECT.

如果使用QtCreator創建類時,沒有選擇繼承自QObject類或其子類,而在創建後手工修改繼承自QObject並手工添加Q_OBJECT,則在編譯時有可能會出現”undefined reference to `vtable for’…….”的錯誤.

解決方法:

在創建類的時候需要選擇繼承自QObject類或其子類。

或者,清理所有項目->執行qmake->構建項目。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章