Qt信号和槽的两种类型

来源:互联网 发布:ubuntu 22端口被拒绝 编辑:程序博客网 时间:2024/06/05 20:28
信号和槽机制
Signal&Slot  信号和槽机制用于两个对象的通信。在GUI编程中,总希望一个部件的变化其他的部件也能够了解到。这就是说,我们希望任何对象都可以和其他的对象进行通信。当一个特殊的事情发生时便可以发射一个信号,比如按钮被单击;而槽就是一个函数,他在信号发射后被用来响应这个信号。一个信号可以关联到多个槽上,多个信号也可以关联到同一个槽上,甚至,一个信号还可以关联到另一个信号上。
下面介绍两种不同的方法实现信号和槽的关联:
1.信号和槽的手动关联:
 signals:
    void dlgReturn(int);//自定义的信号
声明信号要用signals:关键字。同时信号没有返回值,只能是void类型的。因为只有QObject类及其子类才能使用槽机制,QDialog继承自QWidget,而QWidget又继承
自QObject;
在ui界面上添加一个spin box部件和push button部件
然后转到push button的clicked的槽上
void MyDialog::on_pushButton_clicked()
{
    int value=ui->spinBox->value();//获取输入的数值
    emit dlgReturn(value); //发射信号
    close(); //关闭对话框
}
同时定义一个slots:
private slots:
    void showValue(int value);

在Widget构造函数上关联信号和槽
    MyDialog *dlg=new MyDialog(this);
    connect(dlg,SIGNAL(dlgReturn(int)),this,SLOT(showValue(int)));
    dlg->show();
定义函数
void Widget::showValue(int value)
{
    ui->label->setText(tr("获取的值是:%1").arg(value));
}
运行程序,单击button按钮之后,会获取spin box的值同时使用自定义的信号将其作为参数发送出去。发射一个信号要用emit关键字。这就完成了信号和槽的关联
2.信号和槽的自动关联
声明一个private slots:
void on_myButton_clicked();
这里自定义了一个槽,他使用自动关联。然后在cpp文件中添加QPushButton头文件
在构造函数中添加
QPushButton *button=new QPushButton(this); //创建按钮
button->setObjectNmae("my Buttton");//指定函数的对象名
ui->setupUi(this);  //要在定义了部件以后在调用这个函数
void Widget::on_myButton_clicked()
{
close();
}
这样就使用了自动关联了