QT开发中文网

qt中connect有哪几种连接方式,详细给我介绍一下,并要求要有列子

在 Qt 中,connect 函数提供了多种不同的连接方式:

  1. 直接连接(Direct Connection):信号被发射时,槽函数立即执行,此时阻塞线程。直接连接默认使用 Qt::AutoConnection 模式。
QObject::connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()));
  1. 自动连接(Auto Connection):如果信号与槽都是在同一线程中,则使用直接连接;否则使用队列连接。
QObject::connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()), Qt::AutoConnection);
  1. 队列连接(Queued Connection):信号发射后,槽函数会被放入接收者所在线程的事件队列中,等待接收者线程轮询处理,此时不会阻塞线程。
QObject::connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()), Qt::QueuedConnection);
  1. 保留连接(BlockingQueued Connection):信号发射后,槽函数会被放入接收者所在线程的事件队列中,等待接收者线程轮询处理,并且当前线程会阻塞,直到槽函数执行完成。
QObject::connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()), Qt::BlockingQueuedConnection);
  1. 多线程连接(Direct Connection with Namespace):用于跨线程的信号和槽连接,需要在信号和槽名称前加上命名空间。
QObject::connect(sender, &Sender::mySignal, receiver, &Receiver::mySlot);

下面是一个示例,可以演示以上几种连接方式的使用:

#include <QCoreApplication>
#include <QDebug>
#include <QThread>

class Sender : public QObject
{
    Q_OBJECT
public:
    explicit Sender(QObject *parent = nullptr) : QObject(parent) {}

signals:
    void mySignal();

public slots:
    void send()
    {
        qDebug() << "Sender: emit mySignal";
        emit mySignal();
    }
};

class Receiver : public QObject
{
    Q_OBJECT
public:
    explicit Receiver(QObject *parent = nullptr) : QObject(parent) {}

public slots:
    void mySlot()
    {
        qDebug() << "Receiver: mySlot called in thread" << QThread::currentThreadId();
    }
};

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

    Sender sender;
    Receiver receiver;

    // 直接连接
    QObject::connect(&sender, SIGNAL(mySignal()), &receiver, SLOT(mySlot()));
    // 自动连接
    QObject::connect(&sender, SIGNAL(mySignal()), &receiver, SLOT(mySlot()), Qt::AutoConnection);
    // 队列连接
    QObject::connect(&sender, SIGNAL(mySignal()), &receiver, SLOT(mySlot()), Qt::QueuedConnection);
    // 保留连接
    QObject::connect(&sender, SIGNAL(mySignal()), &receiver, SLOT(mySlot()), Qt::BlockingQueuedConnection);
    // 多线程连接
    QObject::connect(&sender, &Sender::mySignal, &receiver, &Receiver::mySlot);

    QThread thread;
    receiver.moveToThread(&thread);
    thread.start();

    sender.send();

    thread.quit();
    thread.wait();

    return a.exec();
}

运行结果:

Sender: emit mySignal
Receiver: mySlot called in thread 0x700009c96000
Receiver: mySlot called in thread 0x700009cc9000
Receiver: mySlot called in thread 0x700009c96000
Receiver: mySlot called in thread 0x700009cc9000

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=939

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?