Qt信号与槽机制

什么是信号、槽?

  1. 信号与槽机制是QT的核心机制。
  2. 信号槽是Qt框架引以为豪的机制之一。所谓信号槽,实际就是调用回调函数。当某个事件发生后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调
  3. 信号和槽是Qt特有的信息传输机制,是Qt设计程序的重要基础,它可以让互不干扰的对象建立一种联系。
  4. 槽函数的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数;也可以被重载;可以是公有的、保护的、私有的、也可以被其他C++成员函数调用。唯一区别的是:槽可以与信号连接在一起,每当和槽连接的信号被发射的时候,就会调用这个槽。
  5. 自定义信号槽:  

        自定义信号槽需要注意的事项

        发送者和接收者都需要是QObject的子类;

        使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码;

        槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;

        使用 emit 在恰当的位置发送信号;

        使用QObject::connect()函数连接信号和槽。

QT信号与槽的关联绑定注册有什么方式

  1. F4、 F3、ui界面编辑方式
  2. ui界面 signal slots Edit方式
  3. 最常规的用法,QT4下使用,现在不推荐:例:
    connect(btn,SIGNAL(clicked()),this,SLOT(myclicked()));需在头文件中分别声明好SIGNAL和SLOT
  4. 自动关联方式,button点右键转到槽:
  5. connect()函数基于函数指针的重载形式,QT5下使用:例:
    connect(btn,&QPushButton::clicked,this,&MainWindow::myclicked);
  6. 手动提交。emit方式:
void MainWindows::on_exit_clicked()
{
    ui->exit->setText("EXIT!");
    //手动提交
    emit mysignal();
}

    lambda,C++11下使用:

        

connect(btn,&QPushButton::clicked,[btn]()
{
    if(btn->text() == "lambda")
        btn->setText("Just Do It!");
    else
        btn->setText("lambda");
    qDebug()<<"11111111111111";
});

信号与槽参数有什么特点?

信号( Signal )就是在特定情况下被发射的事件 , 例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号。

槽( Slot )就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以定义在类的任何部分( public 、 private 或 protected ),可以具有任何参数,也可以被直接调用。

槽函数与一般的函数不同的是 :槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行 。

( 1) 一个信号可以连接多个槽:

( 2 ) 多个信号可 以连接同 一个槽:

(3 ) 一个信 号可 以连接另 外一个信号 :

( 4 )严格的情况下,信号与槽的参数个数和类型需要一致 , 至少信号的参数不能少于槽 的 参

数 。 如果不匹配,会出现编译错误或运行错误。

( 5 )在使用信号与槽的类中,必须在类的定义中加入宏QOBJECT。

( 6 ) 当一个信号被发射 时, 与其关联 的槽函 数通常被立 即执行,就像正常调用 一个函数一样 。

只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码

信号与槽的关联怎么解除?

disconnect(myObject, SIGNAL(mySignal()), 0, 0);

你可能感兴趣的:(qt,开发语言,c++)