QT5信号槽的一些特殊用法

2019-10-16

信号槽最常用的方式,就是1对1connect,之后出发操作。这里总结了一些特殊的便捷操作,例如:QT5信号槽新的连接方式,多个控件信号连接到一个槽,在信号槽中使用lambda表达式等。

一 QT5支持的信号槽新语法

1.1 信号语法对比

老语法:使用SIGNAL及SLOT宏来强转
connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
新语法:第2,4个参数从函数变为函数名
connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);
最简单的例子:第一个参数是信号发送者,第二个参数具体信号,第三个参数信号接收者,第四个参数是槽函数
connect(&ui->btn_test, &QpushButton::click, pobj, &obj::somefun);

1.2新语法的优点

  • 编译期间检查信号和槽是否存在,它们的类型,及Q_OBJECT是否丢失,出错直接编译报错。老语法无法在编译器检查错误。
  • 新语法的信号可以连接QObject的任何普通成员方法,不仅仅是定义的槽函数。
  • 新语法在使用自定义类型参数时,不需要再前置注册这些参数。

二 多个信号连接到同一个槽

1.1 多控件连接

{
    ....
    connect(&ui->btn_test, &QpushButton::click, pobj, &obj::slotfun);
    connect(&ui->btn_start, &QpushButton::click, pobj, &obj::slotfun);
    connect(&ui->spinbox_test, &QspinBox::valueChanged, pobj, &obj::slotfun);
    .....
}
void obj::slotfun()
{
    QObject* obj = sender();
    if (QStringLiteral("btn_test") == obj->objectname())
    {
        ....
    }
    else if (QStringLiteral("btn_start") == obj->objectname())
    {
        ....
    }
    else if (QStringLiteral("spinbox_test") == obj->objectname())
    {
        ....
    }
}

​ 按照以上方式,可以实现多控件连接同一槽函数,简化代码实现,在一个槽函数中做统一处理。

三 信号槽+lambda表达式

​ lambda表达式是一种匿名函数,代码中如果槽函数的功能比较单一且规模很小,可以使用lambda表达式简化代码。

....
connect(&ui->btn_test, &QpushButton::click, [](){std::cout<<"just test lambda<<std::endl;"});

文章评论

comments powered by Disqus


章节列表