信号与槽的机制是进行Qt编程的基础,了解信号与槽机制对我们进行Qt开发具有很大的帮助。举个简单的例子,当我们使用组件PushButton时,在界面上我们点击一下这个PushButton按钮,它就会发送一个clicked()信号,当这个信号被触发时,就会进入到Pushbutton槽函数里面,去实现你想要的功能。
我们来看工程文件夹下的文件:
我们就用最普通的工程文件来说这个问题,这里是使用的Widget窗口,这里不影响哈,但是4种方式。
第一种:在ui设计师界面,鼠标右键单击组件转到槽,选择信号,使用生成的槽函数去实现功能。
void Widget::on_btnclose_clicked()
{
this->close();//关闭当前窗口
}
第二种,通过右键单击ui设计界面的空白处,弹出的提示窗,选择Signal&Slots Editor,再通过下面的+/-添加或删除你想操作的发送者,并选择他的信号和一些其他信息。
第三种,我们直接通过槽函数的命名规则,在功能函数里面写入我们的槽函数,并在.h文件中生命我定义的槽函数。
void Widget::on_pushButton_clicked()
{
static int i = 0;
QString str;
str.sprintf("i=%d",++i);
ui->pushButton->setText(str);//修改pushbutton的文本显示
}
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;//声明 组装界面 定义在“ui_widget.h”文件中
}
class Widget : public QWidget //子类widget的定义
{
Q_OBJECT//支持元对象系统 moc->支持信号与槽
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots://函数声明
void on_btnclose_clicked();
void on_pushButton_clicked();//第三种方式声明,第一种和第二种方式Qt自动帮你写声明
void on_pushButton_2_clicked();
void mySlot(QString str);
void on_btnclose_2_clicked();
signals://信号
void mySignal(QString);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
第四种,使用connect函数关联,这种方式是比较重要的,也是通用的。
void Widget::on_pushButton_2_clicked()//按键槽函数
{
static int i = 0;
QString str;
str.sprintf("i=%d",++i);
emit mySignal(str);//emit用来发送信号
}
void Widget::mySlot(QString str)//自定义的信号,用于connect关联
{
this->setWindowTitle(str);
}
Widget::Widget(QWidget *parent) : //后再函数
QWidget(parent),//基类构造函数传参
ui(new Ui::Widget)//ui = new Ui::Widget
{
ui->setupUi(this);//组装界面
connect(this,SIGNAL(mySignal(QString)),this,SLOT(mySlot(QString)));//在ui里面使用connect函数关联信号与槽
}
Widget::~Widget()//析构函数
{
delete ui;
}
完整代码:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;//声明 组装界面 定义在“ui_widget.h”文件中
}
class Widget : public QWidget //子类widget的定义
{
Q_OBJECT//支持元对象系统 moc->支持信号与槽
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_btnclose_clicked();
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void mySlot(QString str);
signals://信号
void mySignal(QString);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) : //后再函数
QWidget(parent),//基类构造函数传参
ui(new Ui::Widget)//ui = new Ui::Widget
{
ui->setupUi(this);//组装界面
connect(this,SIGNAL(mySignal(QString)),this,SLOT(mySlot(QString)));
}
Widget::~Widget()//析构函数
{
delete ui;
}
void Widget::on_btnclose_clicked()
{
this->close();
}
void Widget::on_pushButton_clicked()
{
static int i = 0;
QString str;
str.sprintf("i=%d",++i);
ui->pushButton->setText(str);
}
void Widget::on_pushButton_2_clicked()
{
static int i = 0;
QString str;
str.sprintf("i=%d",++i);
emit mySignal(str);//emit用来发送信号
}
void Widget::mySlot(QString str)
{
this->setWindowTitle(str);
}