【嵌入式Qt开发入门】如何创建并连接信号与槽

13 篇文章 2 订阅

创建信号

        我们先新建一个项目,命名为 signal_slot_example,如果还不会新建项目,请回到 【嵌入式Qt开发入门】初识信号与槽查看项目如何建立的。取消勾选*ui 文件,其他步骤不变。

        由于信号只需声明,无需定义。所以我们只需要在 mianwindow.h 里声明信号即可。代码如 下,这里创建一个 void pushButtonTextChanged();信号,定义信号最好是贴合信号本身的含义。这个信号的意思是按钮的文本发生改变后的 signal。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
signals:
    void pushButtonTextChanged();
};
#endif // MAINWINDOW_H

       声明了一个信号 void pushButtonTextChanged();可以看到信号无需 public 等关键字修饰。

创建槽

        创建槽的方法也很简单,也是直接在 mianwindow.h 里直接声明槽,在 mianwindow.cpp 里 实现槽的定义,声明槽必须写槽的定义(定义指函数体的实现),否则编译器编译时将会报错。

        槽有以下特点:

1. 槽可以是任何成员函数、普通全局函数、静态函数

2. 槽函数和信号的参数和返回值要一致

        根据上面的槽特点,由于我们声明了信号 void pushButtonTextChanged(); 所以我们声明的槽函数必须是无返回值类型 void,和无需参数。所以声明槽的代码如下。此外我们还声明一个 QPushButton 对象 pushButton。对象 pushButton 可以写成简写 btn。这个根据个人习惯即可!简写的名称建议不要让人看不懂即可!同时还声明一个按钮点击的槽。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
signals:
    void pushButtonTextChanged();
public slots:
    /* 声明一个槽函数 */
    void changeButtonText();
    /* 声明按钮点击的槽函数 */
    void pushButtonClicked();
private:
    /* 声明一个对象 pushButton */
    QPushButton *pushButton;
};
#endif // MAINWINDOW_H

        在 mainwindow.cpp 里实现声明的槽函数 void changeButtonText(); 和 void pushButtonClicked();。同时还实例化了 pushButton 对象。代码如下。

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
   /* 设置窗体的宽为 800,高为 480 */
   this->resize(800,480);
   
   /* 实例化 pushButton 对象 */
   pushButton = new QPushButton(this);
   
   /* 调用 setText()方法设定按钮的文本 */
   pushButton->setText("我是一个按钮");
}

MainWindow::~MainWindow()
{
}

/* 实现按钮点击槽函数 */
void MainWindow::pushButtonClicked()
{
    /* 使用 emit 发送信号 */
    emit pushButtonTextChanged();
}

/* 实现按钮文本改变的槽函数 */
void MainWindow::changeButtonText()
{
    /* 在槽函数里改变按钮的文本 */
    pushButton->setText("被点击了!");
}

        首先,设置了程序窗体的大小,假若不设置,窗体为最小分辨率。实际开发需要以硬件的实际分辨率开发即可。不建议使用低于这个分辨率开发,分辨率太低, 显示的内容过少。

        然后,实例化 pushButton 对象,在堆中实例化,并指定父对象为 this。因为我们在 mai nwindow.h 里声明的是指针类型的对象。

        实际上 QPushButton(this)的原型是 QPushButton (QWidget *parent = nullptr)。实际上 QP ushButton 类中还有下面两种初始化的方法。这也是 C++在 Qt 里重载的体现。

QPushButton(const QString &text, QWidget *parent = nullptr)
QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr)

连接信号与槽

       前面只是声明了信号和定义槽,要在项目中连接信号与槽。完成连接的代码如下。 信号槽连接的代码如下。

connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
connect(this, SIGNAL(pushButtonTextChanged()), this, SLOT(changeButtonText()));

        注意,发送信号的对象,和接收的信号的对象。因为我们 pushButtonClicked()是本类里定义的槽,所以用 this 来接收。同理,pushButtonTextChanged()也是本类定义的信号。所以发送者写成 this。changeButtonText()也是本类的槽函数,所以接收槽的对象也是 this。很多初学者不了解这里的信号的发送者和槽的接收者,究竟该写谁。我们要细读上面的代码和【嵌入式Qt开发入门】初识信号与槽的信号槽机制的定义慢慢理解。 在 mainwindow.cpp 中信号槽连接的代码如下。

        连接信号与槽,整个流程就是当点击了按钮,然后触发了pushButtonClicked(),pushButtonClicked()槽里发送pushButtonTextChanged()信号,changeButtonText()槽响应 pushButtonTextChanged()信号,我们在 changeButtonText()槽实现响应的动作(事件)。最终的实现效果是按钮的文本由“我是一个按钮”被点击时变成“被点击了!”。
        编译程序及运行后,未点击按钮前如下。

         上面的程序虽然简单,但是我们也最终实现了自定义的信号与槽。       

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值