Qt-信号槽

一 信号槽的第五个参数

1.Qt::AutoConnection:信号的发送者与信号的接收者在同一线程,则默认使用Qt::DirectConnection;如果不在同一线程,则默认 使用Qt::QueuedConnection。

2.Qt::DirectConnection:信号的发送者与信号的接收者在同一线程中执行,当发出信号后,会马上进入槽函数,看上去就像在信号 发送位置调用了槽函数,在多线程下会比较危险,容易造成崩溃。

3.Qt::QueuedConnection:信号的发送者与信号的接收者不在同一线程中执行,槽函数运行于信号的接收者线程,当发送信号后, 槽函数不会马上被调用,等待信号的接收者把当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。

4.Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。

5.Qt::UniqueConnection:可以通过按位或(|)与以上四个结合在一起使用。当设置此参数时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。

二 信号-槽的连接方式

6.信号-槽的连接方式

1)、connect(this,SIGNAL(),this,SLOT());

例:connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(onClicked()));

2)、connect(this,&this::signal,this,&this::slot);

例:connect(ui.pushButton,&QPushButton::clicked,this,&Widget::onClicked);

7.信号-槽

1)、信号可以连接信号。

2)、信号可以连接槽,一个信号可以连接多个槽,槽的调用顺序是不确定的。

3)、多个信号可以连接同一个槽。

4)、信号与槽都可以被重载、重载后使用6中的第一种方式连接要好一些,因为第一种连接方式能带上参数。

  1. 信号连接多次后,槽函数也将执行多次

8.断开信号-槽

disconnect(this,SIGNAL(),this,SLOT());

disconnect(this,&this::signal,this,&this::slot);

//也可以阻塞信号,信号槽同样不会响应

9.使用信号-槽要求

1)、继承自QObject类,必须声明Q_OBJECT宏

2)、声明信号signals、Q_SIGNALS,一般信号都为void型,没有private、public、protected区分。

例:void sigSendData();

发射信号:emit sigSendData()、或者Q_EMIT sigSendData();

3)、声明槽slots、Q_SLOTS,槽有private、public、protected区分,槽相当于成员函数,可以直接调用

槽可以重载(因为他相当于成员函数)。

10.注意事项

1)、宏定义不能放在信号-槽中。

2)、构造函数不能声明在信号-槽中。

3)、函数指针不能作为信号-槽参数。

11lamda connect 方式

connect(ui_.setSpeedPushButton, &QPushButton::clicked, [this]
{
    if (ui_.speedTableWidget->item(0, 0) && ui_.speedTableWidget->item(1, 0))
    {
        auto text1 = ui_.speedTableWidget->item(0, 0)->text();
        auto text2 = ui_.speedTableWidget->item(1, 0)->text();
        adserver_.xSpeedAndOmegaSpeed(text1.toFloat(), text2.toFloat());
    }
});

capture mutable ->return-type{statement}

[ ] 中的参数
1.[var]表示值传递方式捕捉变量var;
2.[=]表示值传递方式捕捉所有父作用域的变量(包括this);
3.[&var]表示引用传递捕捉变量var;
4.[&]表示引用传递方式捕捉所有父作用域的变量(包括this);
5.[this]表示值传递方式捕捉当前的this指针。

上面提到了一个父作用域,也就是包含Lambda函数的语句块,说通俗点就是包含Lambda的“{}”代码块。上面的捕捉列表还可以进行组合,例如:

1.[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量;
2.[&,a,this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。

不过值得注意的是,捕捉列表不允许变量重复传递。下面一些例子就是典型的重复,会导致编译时期的错误。例如:

3.[=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;
4.[&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值