Qt信号槽connect的第五个参数,5种连接方式

目录

5种连接方式:

1、自动连接

2、直接连接

3、队列连接

4、阻塞队列连接

5、唯一连接

代码如下:


完整代码下载https://download.csdn.net/download/mars1199/88520061

Qt信号槽连接的函数是connect函数,共有5个参数,第五个参数是表示连接方式;

默认情况下,第五个参数是不用写的,使用的缺省值,是自动连接;

当使用自动连接的时候,单线程时,会自动切换到直接连接,多线程时会切换到队列连接;

5种连接方式:

1、自动连接

        会根据线程来自动切换。

2、直接连接

        单线程时使用,会同步阻塞执行,发信号之后,当槽执行完了,才能往下执行发射信号之后的代码。

3、队列连接

        是一个异步非阻塞的效果,其实单线程,多线程都可以使用,当发射信号之后,不需要等待槽执行,就可以立马往下执行发射信号之后的代码。

4、阻塞队列连接

        多线程同步阻塞执行的效果,必须是多线程的情况下使用,如果是单线程,则会发生死锁。

5、唯一连接

        主要是用来防止相同的信号槽重复连接的。

代码如下:

自动连接代码:

connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::AutoConnection); // 自动连接

直接连接:

connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::DirectConnection); // 直接连接

队列连接:

connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::QueuedConnection); // 队列连接

阻塞队列连接:

connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::BlockingQueuedConnection); // 阻塞队列连接

唯一连接:

connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::UniqueConnection); // 唯一连接

核心代码如下:

头文件:


#include <QMainWindow>

namespace Ui {
class ConnectMainWindow;
}

class ConnectMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit ConnectMainWindow(QWidget *parent = 0);
    ~ConnectMainWindow();
signals:
    void mySignal(); // 自定义信号
private slots:
    void mySlot(); // 自定义槽,需要有 实现
    
private:
    Ui::ConnectMainWindow *ui;
};

源文件:

#include "connectmainwindow.h"
#include "ui_connectmainwindow.h"
#include <QDebug>

ConnectMainWindow::ConnectMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ConnectMainWindow)
{
    ui->setupUi(this);
    // 请将以下代码,依次放开注释测试即可。
    connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::AutoConnection); // 自动连接
    //connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::DirectConnection); // 直接连接
    //connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::QueuedConnection); // 队列连接
    // 单线程情况下,使用阻塞队列连接会发生死锁
    //connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::BlockingQueuedConnection); // 阻塞队列连接

    //之所以写2条一样的,就是为了测试有没有成功阻止重复连接
    //connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::UniqueConnection); // 唯一连接
    //connect(this,SIGNAL(mySignal()),this,SLOT(mySlot()),Qt::UniqueConnection); // 唯一连接
}

ConnectMainWindow::~ConnectMainWindow()
{
    delete ui;
}

void ConnectMainWindow::mySlot()
{
    qDebug()<<"test connect type.";
}

void ConnectMainWindow::on_pushButton_clicked()
{
    emit mySignal(); // 发射信号,注意,使用阻塞队列连接时,单线程会死锁
}

完整代码下载https://download.csdn.net/download/mars1199/88520061

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,我们可以得知QT信号第五个参数连接类型。连接类型有五,分别是: 1. Qt::AutoConnection:自动连接方式,如果信号在同一线程中,则采用直接连接方式,否则采用队列连接方式。 2. Qt::DirectConnection:直接连接方式,当信号发射时,函数会立即执行,无论信号在哪个线程中。 3. Qt::QueuedConnection:队列连接方式,当信号发射时,函数会被放入接收者对象所在的线程的事件队列中,等待事件循环处理。 4. Qt::BlockingQueuedConnection:阻塞队列连接方式,当信号发射时,函数会被放入接收者对象所在的线程的事件队列中,但是发射信号的线程会被阻塞,直到函数执行完毕。 5. Qt::UniqueConnection:唯一连接方式,如果信号已经连接到了某个函数,再次连接时会失败。 下面是一个例子,演示了如何使用第五个参数连接信号: ```cpp // 定义一个信号 class Sender : public QObject { Q_OBJECT signals: void mySignal(int value); }; // 定义一个函数 class Receiver : public QObject { Q_OBJECT public slots: void mySlot(int value) { qDebug() << "Received value: " << value; } }; // 在main函数中连接信号 int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Sender sender; Receiver receiver; // 使用Qt::QueuedConnection连接信号 QObject::connect(&sender, SIGNAL(mySignal(int)), &receiver, SLOT(mySlot(int)), Qt::QueuedConnection); // 发射信号 emit sender.mySignal(100); return a.exec(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五木大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值