在 Qt 中,emit 是一个用于发射信号的关键字。它是 Qt 的信号与槽(Signals and Slots)机制的一部分,用于在某个条件满足时通知其他对象。发射信号是一种实现对象之间通信的方式,特别是在事件驱动编程模型中。

Qt 信号与槽机制概述

  • 信号(Signal):信号是对象状态改变的通知。信号不包含任何实现,仅仅是一个声明。当对象的状态改变时,它会发射相应的信号。
  • 槽(Slot):槽是一个可以处理信号的普通成员函数。槽可以是对象的成员函数,也可以是全局函数。

使用 emit 发射信号

emit 关键字用于发射信号。它是一个预处理器宏,可以忽略不使用,但为了代码的可读性和维护性,通常会使用它。

信号与槽的声明和实现

假设有一个类 MyClass,我们希望在某个事件发生时发射一个信号:

MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>
#include <QString>

class MyClass : public QObject
{
    Q_OBJECT

public:
    explicit MyClass(QObject *parent = nullptr);

signals:
    void log(QString message);

public slots:
    void doSomething();

};

#endif // MYCLASS_H
MyClass.cpp
#include "MyClass.h"
#include <QDebug>

MyClass::MyClass(QObject *parent) : QObject(parent)
{
}

void MyClass::doSomething()
{
    // 在某个条件下发射信号
    emit log("Something happened!");
}

连接信号与槽

为了使信号与槽机制工作,需要将信号连接到相应的槽。这可以在对象的初始化时完成。

main.cpp
#include <QCoreApplication>
#include "MyClass.h"

void logMessage(QString message)
{
    qDebug() << message;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MyClass myObject;

    // 连接信号与槽
    QObject::connect(&myObject, &MyClass::log, &logMessage);

    // 执行某个操作
    myObject.doSomething();

    return a.exec();
}

在这个示例中,当 MyClass 对象执行 doSomething() 方法时,它会发射 log 信号,并且连接到 logMessage 槽函数,该函数将打印日志信息。

总结

  • 信号:用于通知其他对象某些事件的发生。
  • :用于处理信号,可以是普通成员函数或全局函数。
  • emit:用于发射信号的关键字,发射信号通知所有连接到该信号的槽函数。

通过这种机制,Qt 实现了松耦合的对象通信方式,使得程序的可维护性和扩展性大大增强。

06-19 17:01