信号和槽:
信号:一个特定的标识,当内部发生某些事件或状态改变时能够被“发射”如:emit singal();
槽:槽和普通的c++类几乎是一样的
唯一的不同的是:槽可以和信号连接在一起,当发射这个信号的时候,就会自动调用这个槽
对象之间通信的高级接口
信号与槽的连接
基本语句:
QObject::connect(a,SIGNAL(a_signal(int)),b,SLOT(b_slot(int)),Qt::ConnectiopnType)
其中:Qt::ConnectionType定义了关联方式:
1、Qt::DirectConnection
2、Qt::QueuedConnection
3、Qt::AutoConnection (默认)
其他相关联模式:
一个信号可以连接多个槽(顺序任意)
多个信号可以连接一个槽
一个信号可以与另外一个信号相连连接
注意点:
a_signal和b_slot 中只能有参数类型,而非具体的值,且类型为Qt已知的类型
要把信号成功连接到槽或另一个信号,它们的参数必须具有相同的顺序和类型
如果信号参数比槽多,多余的参数将被忽略
#include "singall.h" #include "ui_singall.h"
singall::singall(QWidget *parent) : QWidget(parent), ui(new Ui::singall) { ui->setupUi(this); connect(ui->showButton,SIGNAL(clicked()),ui->label,SLOT(show())); connect(ui->hideButton,SIGNAL(clicked()),ui->label,SLOT(hide())); connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->progressBar,SLOT(setValue(int))); connect(ui->quitButton,SIGNAL(clicked()),this,SLOT(close())); }
singall::~singall() { delete ui; }
|
手动实现:
ctrl+r 编译后:
下面是自定义信号和槽:
代码实现:
#include "singall.h" #include "ui_singall.h" #include <Qdebug> singall::singall(QWidget *parent) : QWidget(parent), ui(new Ui::singall) { ui->setupUi(this); connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(mySlot(int))); connect(this,SIGNAL(mySignal(int)),ui->progressBar,SLOT(setValue(int))); }
singall::~singall() { delete ui; } void singall::mySlot(int a) { ui->label->setText(QString::number(a)); if( a == 87) { qDebug()<<"a=87"; emit mySignal(10); } }
|
#ifndef SINGALL_H #define SINGALL_H
#include <QWidget>
namespace Ui { class singall; }
class singall : public QWidget { Q_OBJECT
public: explicit singall(QWidget *parent = 0); ~singall();
private: Ui::singall *ui; signals://自定义信号
void mySignal(int);//写号一个信号
private slots: //槽
void mySlot(int);//写好一个槽
};
#endif // SINGALL_H
|
一种系统自动进行生成函数的方法:
点击OK按钮
void signal2::on_pushButton_clicked(){
写入你想控制的槽或信号;
}
这样就创建了一个不用connect函数连接的系统函数
QTimer定时器
QTimer *timer = new QTimer(this);
timer->start(1000);//1000是一秒
也就是每隔1s发送一个timeout()信号
此例可以说明:
#ifndef DISPLAY1_H #define DISPLAY1_H
#include <QWidget> #include <QTimer> namespace Ui { class display1; }
class display1 : public QWidget { Q_OBJECT
public: explicit display1(QWidget *parent = 0); ~display1(); int num; private: Ui::display1 *ui; QTimer *timer;
private slots: void dispayer(); void on_pushButton_2_clicked(); void on_pushButton_clicked(); };
#endif // DISPLAY1_H
|
#include "display1.h" #include "ui_display1.h" #include <QTimer>
display1::display1(QWidget *parent) : QWidget(parent), ui(new Ui::display1) { num = 10; ui->setupUi(this); timer = new QTimer(this); timer->start(1000); connect(this->timer,SIGNAL(timeout()),this,SLOT(dispayer())); }
display1::~display1() { delete ui; }
void display1::on_pushButton_clicked() { timer->stop(); }
void display1::on_pushButton_2_clicked() { timer->start(); } void display1::dispayer() { num--; if(0 == num) { num =10; } ui->lcdNumber->display(num); }
|
效果图
#include "display1.h" #include "ui_display1.h" #include <QTimer>
display1::display1(QWidget *parent) : QWidget(parent), ui(new Ui::display1) { num = 10; ui->setupUi(this); timer = new QTimer(this); timer->start(1000); connect(this->timer,SIGNAL(timeout()),this,SLOT(dispayer())); }
display1::~display1() { delete ui; }
void display1::on_pushButton_clicked() { timer->stop(); ui->pushButton->setEnabled(false); ui->pushButton_2->setEnabled(true); }
void display1::on_pushButton_2_clicked() { timer->start(); ui->pushButton->setEnabled(true); ui->pushButton_2->setEnabled(false); } void display1::dispayer() { num--; if(0 == num) { num =10; } ui->lcdNumber->display(num); }
|
阅读(3443) | 评论(0) | 转发(0) |