Qt的信号和槽机制

一、信号和槽机制

    信号和槽用于两个对象之间的通信,我们希望任何对象都可以和其他对象进行通信。
    当一个特殊的事情发生时便可以发射一个信号,而槽就是一个函数,它在信号发射后被调用来相应这个信号。(强耦合)
    一个信号对应一个槽;一个信号也可以关联多个槽;多个信号关联一个槽;一个信号关联另一个信号。

二、mySignalSlot实例

新建QtGui应用>>项目名mySignalSlot>>基类QWidget>>新建Qt设计师界面>>Dialog without Buttons>>类名MyDialog

mydialog.h添加一个信号:

  1. signals:
  2.     void dlgReturn(int); //自定义的信号

    signals没有public、private、protected等限定符。并且只有申明没有实现。只有QObject类和其子类派生的类才能使用信号和槽机制。
    信号和槽在类申明最开始处添加Q_OBJECT宏(自动完成)

mydialog.ui>>添加Spin Box部件和Push Button部件>>PushButton显示为确定>>pushButton增加槽如下:

  1. void MyDialog::on_pushButton_clicked() //确定按钮
  2. {
  3.     int value = ui->spinBox->value(); //获取输入的数值
  4.     emit dlgReturn(value); //发射信号
  5.     close(); //关闭对话框
  6. }

widget.h添加自定义槽

  1. private slots:
  2.     void showValue(int value);

widget.ui>>拖入Label部件>>更改为"获取的值是:"

widget.cpp>>添加头文件#include "mydialog.h">>在构造函数中添加:

  1.     MyDialog *dlg = new MyDialog(this);
  2.     connect(dlg, SIGNAL(dlgReturn(int)), this, SLOT(showValue(int)));
  3.     dlg->show();

这里创建了一个MyDialog,使用Widget作为父部件。然后将MyDialog类的dlgReturn()信号与Widget类的showValue()槽进行关联。
connect()原型:

  1. static QMetaObject::Connection connect(const QObject *sender, const char *signal,
  2.                         const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);
第一个:发送信号的对象
第二个:要发送的信号
第三个:接收信号的对象
第四个:执行的槽
对于信号和槽,必须使用SIGNAL()和SLOT()宏将参数转化成const char *类型。


widget.cpp:

  1. void Widget::showValue(int value)
  2. {
  3.     ui->label->setText(tr("获取的值是:%1").arg(value));
  4. }

    

无欲速,无见小利。欲速,则不达;见小利,则大事不成。
原文地址:https://www.cnblogs.com/ch122633/p/7363235.html