美文网首页
Qt的信号与槽机制

Qt的信号与槽机制

作者: 仙人掌__ | 来源:发表于2024-05-05 11:06 被阅读0次

Qt元对象

为了在运行期获得对象的类型、类名成员变量列表、函数列表等等功能,Qt推出了元对象系统(和iOS开发中元对象类似),由MOC(元对象编译器)工具在编译期间自动生成,它是属性和信号与槽机制实现的前提
要使用元对象首先必须继承于QObject;其次声明类时使用Q_OBJECT关键字

Qt属性

通过关键字Q_PROPERTY就可以声明一个属性,可以简化成员变量设置及获取相关代码,对外隐藏成员变量

class QTProperty : public QObject {
    Q_OBJECT
    Q_PROPERTY(bool focus MEMBER m_focus)
    Q_PROPERTY(bool focus2 MEMBER m_focus2)
    Q_PROPERTY(bool focus3)
public:
    explicit QTProperty(QObject *parent = nullptr);
    ~QTProperty() override;
private:
    bool m_focus;
    bool m_focus2;
};

Qt信号和槽

Qt对象间的通信机制


image.png

信号和槽本质上是成员函数,信号函数函数体编译期间自动生成,槽函数用于接受回调,信号和槽函数具有相同的参数,当发送信号时可以传递该参数给槽函数

class QTProperty : public QObject {
    Q_OBJECT
public:
    explicit QTProperty(QObject *parent = nullptr);
    ~QTProperty() override;
    void testSignal() {
        sendFunc(5);
    }
signals:
    // 不需要自己实现,由Qt工具自动生成相关代码
    void sendFunc(int val);
};

class QTProperty2 : public QObject {
    Q_OBJECT
public:
    explicit QTProperty2(QObject *parent = nullptr);
    ~QTProperty2() override;
//  slots前必须有public关键字
public slots:
    // 槽函数和信号函数参数应该是对应的
    static void receiveFunc(int val){
        qDebug("receiveFunc() %d",val);
    };
};

// 测试用例
QTProperty objA;
QTProperty2 objB;
connect(&objA, &QTProperty::sendFunc, &objB, &QTProperty2::receiveFunc);
objA.testSignal();

事件处理

在 Qt 中,事件作为一个对象,继承自 QEvent 类,常见的有键盘事件 QKeyEvent、鼠标事件 QMouseEvent 和定时器事件 QTimerEvent 等。


image.png

事件在QWidget类视图的处理流程


image.png

默认情况下QWidget的event()函数会根据事件类型调用对应的时间处理函数,然后再把事件向上传给父视图。

相关文章

网友评论

      本文标题:Qt的信号与槽机制

      本文链接:https://www.haomeiwen.com/subject/vhcgadtx.html