Qt关联信号与槽的四种方式

信号与槽的机制是进行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);
}

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值