1. 自定义槽

  • 槽可以是任何成员函数、普通全局函数、静态函数
  • 槽函数和信号的参数和返回值要一致
  • 由于信号是没有返回值的, 槽函数也一定没有返回值

    首先在mainwidget.h中添加槽函数:
public slots:
void mySlot();

之后在mainwidget.cpp文件中定义槽函数:

void MainWidget::mySlot()
{
b2->setText("^_^");
}

现在, 我们希望当Button2按下时, Button2显示的文本变成笑脸, 就需要将Button2的信号和我们自定义的槽函数连接:

connect(b2, &QPushButton::clicked, this, &MainWidget::mySlot);

保存后运行, 点击Button2就会变成笑脸了:

附录

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H #include <QWidget>
#include <QPushButton> class MainWidget : public QWidget
{
Q_OBJECT public:
MainWidget(QWidget *parent = 0);
~MainWidget(); public slots:
void mySlot(); private:
QPushButton b1;
QPushButton *b2;
}; #endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"

MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
b1.setParent(this);
b1.setText("Close");
b1.move(50, 50); b2 = new QPushButton(this);
b2->setText("Button2");
b2->move(150, 50); connect(&b1, &QPushButton::clicked, this, &MainWidget::close); connect(b2, &QPushButton::clicked, this, &MainWidget::mySlot); } void MainWidget::mySlot()
{
b2->setText("^_^");
} MainWidget::~MainWidget()
{ }

2. 自定义信号

目标: 实现两个独立窗口之间的切换, 点击"Next" 跳到下一个窗口, 点击"Back" 返回到上一个窗口.

  • 信号没有返回值, 但可以有参数
  • 信号只有函数声明, 无需定义
  • 使用emit 发送信号

    首先修改当前窗口标题为"Window1", 并设置窗口大小:
    this->setWindowTitle("Window1");  // this->可以省略
this->resize(300, 200); // 长300, 宽200

之后修改Button2的文本"Button2"为"Next"

新建一个窗口

右键工程目录"SignalAndSlot" --> Add New:



选择 C++ --> C++ Class --> Choose:



输入Class name为SubWidget, Base class为QWidget, 点击Next, 点击Finish:



之后一个新的窗口类就新建好了:

修改新窗口的标题:

在subwidget.cpp中构造函数下, 设置窗口的标题为"Window2", 大小和Windows1一样:

    this->setWindowTitle("Windows2");
this->resize(300, 200);

在新窗口中加入按键:

首先, 在subwidget.h中添加头文件, 然后声明按钮 b:

private:
QPushButton b;

在subwidget.cpp中, 对按钮进行编辑:

    b.setParent(this);
b.setText("Back");
b.move(150, 50);

实例化SubWidget:

但是, 我们仅仅是写了一个新窗口的类, 还没有实例化, 所以我们在mainwidget.h中先包含subwidget的头文件, 然后实例化一个副窗口subWin对象:

    SubWidget subWin;

建立信号与槽的连接:

接下来, 我们来实现点击"Next"显示Windows2功能, 其实就是b2点击这个信号, 触发副窗口的show(), 并隐藏主窗口.

将mainwidget.h和mainwidget.cpp中所有的mySlot改为nextSlot. (共三处)

我们修改mainwidget.cpp中nextSlot()的定义:

void MainWidget::nextSlot()
{
// 删除 b2->setText("^_^");
subWin.show();
this->hide();
}

connect(b2, &QPushButton::clicked, this, &MainWidget::nextSlot);不变. 保存并运行, 就可以实现切换到Window2窗口了. 但是还没有返回主窗口功能.

信号的创建和发送:

要实现Back功能, 就需要在"Back"按钮按下后, 副窗口发送一个信号, 然后主窗口收到这个信号后, 显示自己, 隐藏副窗口, 逻辑如下:

Back按下的信号 ----> 副窗口发送信号

副窗口的信号 ----> 主窗口show, 副窗口hide

下面看代码怎么写:

在subwidget.h中声明一个自定义的信号, 和用于发送该信号的槽函数:

signals:
void backSignal(); public slots:
void sendSignal();

由于信号只需声明, 无需定义, 所以只要在subwidget.cpp定义槽函数来发送信号:

void SubWidget::sendSignal()
{
emit backSignal();
}

之后在Back按钮按下后, 通过这个槽函数发送返回信号:

connect(&b, &QPushButton::clicked, this, &SubWidget::sendSignal);

在mainwidget中需要再定义一个槽函数来处理back信号:

在mainwidget.h中声明槽函数

    void backSlot();

之后在mainwidget.cpp中定义:

void MainWidget::backSlot()
{
this->show();
subWin.hide();
}

之后connect信号与槽, 收到副窗口发送的信号后返回主窗口:

    connect(&subWin, &SubWidget::backSignal, this, &MainWidget::backSlot);

保存后运行, 现在可以在两个界面中切换了.



附录

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H #include <QWidget>
#include <QPushButton>
#include "subwidget.h" class MainWidget : public QWidget
{
Q_OBJECT public:
MainWidget(QWidget *parent = 0);
~MainWidget(); public slots:
void nextSlot();
void backSlot(); private:
QPushButton b1;
QPushButton *b2; SubWidget subWin;
}; #endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"

MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("Window1");
this->resize(300, 200);
b1.setParent(this);
b1.setText("Close");
b1.move(50, 50); b2 = new QPushButton(this);
b2->setText("Next");
b2->move(150, 50); connect(&b1, &QPushButton::clicked, this, &MainWidget::close);
connect(b2, &QPushButton::clicked, this, &MainWidget::nextSlot);
connect(&subWin, &SubWidget::backSignal, this, &MainWidget::backSlot); } void MainWidget::nextSlot()
{
subWin.show();
this->hide();
} void MainWidget::backSlot()
{
subWin.hide();
this->show();
} MainWidget::~MainWidget()
{ }

subwidget.h

#ifndef SUBWIDGET_H
#define SUBWIDGET_H #include <QWidget>
#include <QPushButton> class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = nullptr); signals:
void backSignal(); public slots:
void sendSignal(); private:
QPushButton b;
}; #endif // SUBWIDGET_H

subwidget.cpp

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("Windows2");
this->resize(300, 200); b.setParent(this);
b.setText("Back");
b.move(150, 50); connect(&b, &QPushButton::clicked, this, &SubWidget::sendSignal);
} void SubWidget::sendSignal()
{
emit backSignal();
}

此文原创禁止转载,转载文章请联系博主并注明来源和出处,谢谢!

作者: Raina_RLN https://www.cnblogs.com/raina/

Qt5教程: (3) 自定义信号与槽的更多相关文章

  1. Qt之自定义信号和槽函数

    自定义信号和槽函数: 1.类的声明和实现分别放在.h和.cpp文件中: 2.类声明包含Q_OBJECT宏: 3.信号只要声明不要设计其的实现函数 4.发射信号用emit关键字 5.自定义槽的实现与普通 ...

  2. 【PyQt5-Qt Designer】pyqtSignal()-高级自定义信号与槽

    PyQt 5信号与槽的几种高级玩法 参考:http://www.broadview.com.cn/article/824 from PyQt5.QtCore import QObject , pyqt ...

  3. QT_5_ Qt中信号和槽 + 自定义信号和槽 + lambda 表达式

    1.Qt中信号和槽 1.1 需求:点击按钮关闭窗口 1.2 利用connect进行链接 1.3 参数1 信号发送者(指针) 参数2 发送的信号(信号地址) 参数3 信号的接受者(指针) 参数4 处理槽 ...

  4. 第15.19节 PyQt(Python+Qt)入门学习:自定义信号与槽连接

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 本文利用中介绍了PyQt中的信号和槽机制,除了使用PyQt组件的已有信号外,PyQt和Qt ...

  5. QT自定义信号和槽

    最近项目中使用到QT,在此记录一下QT的核心,信号与槽: QObject::connect(const QObject *sender, const char *signal, const QObje ...

  6. QT5:第八章 信号与槽机制

    一.简介 QT编程中信号与槽用于处理界面各个组件的交互,类似与MFC的消息循环和绑定 注意:在使用信号与槽的类中,必须在类的定义中加入宏定义Q_OBJECT 信号(Signal)就是在特定情况下被发射 ...

  7. QT信号和槽函数学习笔记

    //connect 函数有4个参数 分别是 发送者 信号.接受者 ,槽 //connect(sender,signal,receiver,slot) /* * 信号和槽 * 信号 就是一个普通的函数 ...

  8. PyQt学习随笔:自定义信号连接时报AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...

  9. PyQt(Python+Qt)学习随笔:自定义信号在emit发射信号时报错:AttributeError: object has no attribute

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...

随机推荐

  1. [币严BIZZAN区块链]数字货币交易所钱包对接之比特币(BTC)

    在币严BIZZAN开发数字货币交易所的过程中,一共有两大难点,一个是高速撮合交易引擎,另一个是钱包对接,这两者是我们团队以前没有接触过的.这个系列的文章主要介绍数字货币交易所钱包对接实现技术.第一个要 ...

  2. 利用HBuilder打包Vue开发的webapp为app

    众所周知,前端开发完成的webapp只能运行在浏览器上,对运行环境有一定的限制,也就是除了浏览器其他的环境下不支持:那么现在如果有个需求是这样的呢?需要一套代码三端运行呢?三端运行(黑人脸??)是的, ...

  3. HDFS原理及操作

    1 环境说明 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户并在系统根目录下创建/app目录,用于存放 Hadoop等组件运行包.因为该目录用于安装had ...

  4. HBase介绍、安装与应用案例

    搭建环境 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户并在系统根目录下创建/app目录,用于存放 Hadoop等组件运行包.因为该目录用于安装hadoo ...

  5. STL中的unique和unique_copy函数

    一.unique函数 这个函数的功能就是删除相邻的重复元素,然后重新排列输入范围内的元素,并返回一个最后一个无重复值的迭代器(并不改变容器长度). 例如: vector<); ; i < ...

  6. 字节输入流InputStream

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FileIn ...

  7. Cabloy-CMS:动静结合,解决Hexo痛点问题(进阶篇)

    前言 前一篇文章 介绍了如何通过Cabloy-CMS快速搭建一个博客站点. 这里简单介绍Cabloy-CMS静态站点的渲染机制,更多详细的内容请参见https://cms.cabloy.com 渲染规 ...

  8. JavaScript DOM 编程艺术

    最近把JavaScript DOM 编程艺术这本书看完了,觉得这本书很好 深入浅出地展示了渐进增强.平稳退化.结构和样式分离等编程思想,我对书中重要的知识进行了梳理总结. 一.网页 二.JavaScr ...

  9. 安装vue开发环境

    每次搜索vue开发环境安装时,总是有很多种版本,虽然都能安装完成,但还是整理下自己觉得比较好的版本吧 1.首先安装nodeJs以及也把git安装好(反正开发也是需要git),安装完成后执行 node ...

  10. 配置Redis(远程访问及授权设置)

    配置Redis(远程访问及授权设置) 1.将redis.conf里面的bind 127.0.0.1这一行注释掉,添加自己服务器的IP 2. 还有,找到protected-mode这行, 将改为yes. ...