简介
- 信号:当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
- 槽:用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
- 信号与槽的连接:
connect(谁,发出什么信号,谁,执行什么操作);
特点
- 一个信号可以连接多个槽
当信号发射时,会以不确定的顺序一个接一个的调用各个槽。 - 多个信号可以连接同一个槽
即无论是哪一个信号被发射,都会调用这个槽。 - 信号直接可以相互连接
发射第一个信号时,也会发射第二个信号。 - 连接可以被移除
这种情况用得比较少,因为在对象被删除时,Qt会自动移除与这个对象相关的所有连 接。语法如下:
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
示例
下面是运用QT所写的简单计算器代码。
QT本身可以将项目分为三个部分:界面布局、模型代码、控制器。
具体可以参考我学习的视频,我觉得还不错。
- 界面布局
- 模型代码
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include "model.h"
#include <QString>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private slots:
void getBtn0();
void getBtn1();
void getBtn2();
void getBtn3();
void getBtn4();
void on_pushButton_5_clicked();
void on_pushButton_6_clicked();
void on_pushButton_7_clicked();
void on_pushButton_8_clicked();
void on_pushButton_9_clicked();
void on_pushButton_ride_clicked();
void on_pushButton_div_clicked();
void on_pushButton_add_clicked();
void on_pushButton_sub_clicked();
void on_pushButton_equal_clicked();
void on_pushButton_c_clicked();
private:
QString tmp;
Ui::Dialog *ui;
model * mode;
};
#endif // DIALOG_H
model.h
#ifndef MODEL_H
#define MODEL_H
#include <QString>
class model
{
public:
model();
void setNum1(int num);
void setNum2(int num);
void setFlog(QString flog);
QString doExpr();
private:
int num1;
int num2;
QString flog;
};
#endif // MODEL_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
connect(this->ui->pushButton_0,SIGNAL(clicked(bool)),this,SLOT(getBtn0()));
connect(this->ui->pushButton_1,SIGNAL(clicked(bool)),this,SLOT(getBtn1()));
connect(this->ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(getBtn2()));
connect(this->ui->pushButton_3,SIGNAL(clicked(bool)),this,SLOT(getBtn3()));
connect(this->ui->pushButton_4,SIGNAL(clicked(bool)),this,SLOT(getBtn4()));
this->mode=new model;
this->tmp="";
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::getBtn0()
{
if(this->tmp!=""){
this->tmp+=this->ui->pushButton_0->text();
this->ui->label->setText(this->tmp);
}
}
void Dialog::getBtn1()
{
this->tmp+=this->ui->pushButton_1->text();
this->ui->label->setText(this->tmp);
}
void Dialog::getBtn2()
{
this->tmp+=this->ui->pushButton_2->text();
this->ui->label->setText(this->tmp);
}
void Dialog::getBtn3()
{
this->tmp+=this->ui->pushButton_3->text();
this->ui->label->setText(this->tmp);
}
void Dialog::getBtn4()
{
this->tmp+=this->ui->pushButton_4->text() ;
this->ui->label->setText(this->tmp);
}
void Dialog::on_pushButton_5_clicked()
{
this->tmp+=this->ui->pushButton_5->text() ;
this->ui->label->setText(this->tmp);
}
void Dialog::on_pushButton_6_clicked()
{
this->tmp+=this->ui->pushButton_6->text() ;
this->ui->label->setText(this->tmp);
}
void Dialog::on_pushButton_7_clicked()
{
this->tmp+=this->ui->pushButton_7->text() ;
this->ui->label->setText(this->tmp);
}
void Dialog::on_pushButton_8_clicked()
{
this->tmp+=this->ui->pushButton_8->text() ;
this->ui->label->setText(this->tmp);
}
void Dialog::on_pushButton_9_clicked()
{
this->tmp+=this->ui->pushButton_9->text() ;
this->ui->label->setText(this->tmp);
}
void Dialog::on_pushButton_ride_clicked()
{
int num=this->tmp.toInt();
this->mode->setNum1(num);
this->tmp="";
QString ex=this->ui->pushButton_ride->text();
this->mode->setFlog(ex);
}
void Dialog::on_pushButton_div_clicked()
{
int num=this->tmp.toInt();
this->mode->setNum1(num);
this->tmp="";
QString ex=this->ui->pushButton_div->text();
this->mode->setFlog(ex);
}
void Dialog::on_pushButton_add_clicked()
{
int num=this->tmp.toInt();
this->mode->setNum1(num);
this->tmp="";
QString ex=this->ui->pushButton_add->text();
this->mode->setFlog(ex);
}
void Dialog::on_pushButton_sub_clicked()
{
int num=this->tmp.toInt();
this->mode->setNum1(num);
this->tmp="";
QString ex=this->ui->pushButton_sub->text();
this->mode->setFlog(ex);
}
void Dialog::on_pushButton_equal_clicked()
{
int num=this->tmp.toInt();
this->mode->setNum2(num);
QString res=this->mode->doExpr();
this->ui->label->setText(res);
this->tmp="";
}
void Dialog::on_pushButton_c_clicked()
{
this->tmp="";
this->ui->label->setText("0");
}
model.cpp
#include "model.h"
model::model()
{
this->num1=0;
this->num2=0;
}
void model::setNum1(int num)
{
this->num1=num;
}
void model::setNum2(int num)
{
this->num2=num;
}
void model::setFlog(QString flog)
{
this->flog=flog;
}
QString model::doExpr()
{
int result=0;
if(this->flog=="+"){
result=num1+num2;
}
else if(this->flog=="*"){
result=this->num1*this->num2;
}
else if(this->flog=="-"){
result=this->num1-this->num2;
}
else if(this->flog=="/"){
if(this->num2==0){
return "error";
}
result=this->num1/this->num2;
}
else{ //被除数不为0
return QString::number(this->num1);
}
return QString::number(result);
}
main.cpp
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}