Chinaunix首页 | 论坛 | 博客
  • 博客访问: 498602
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: C/C++

2017-08-05 13:23:00

一、信号和槽机制

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

二、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. }
    
阅读(1380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~