QT中信号与槽机制的介绍,以及信号与槽连接的几种方式

这篇具有很好参考价值的文章主要介绍了QT中信号与槽机制的介绍,以及信号与槽连接的几种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

信号与槽机制

信号与槽的介绍

  • 功能:实现多个组件之间的相互通信,是QT引以为傲的核心机制
  • 信号:就是信号函数,定义在类体的signals权限下,是一个不完整的函数,只有声明没有定义;
  • 槽:就是槽函数,定义在类体的slots权限下,是一个完整的函数,既有声明也有定义,也可以当做普通函数被使用
  • 无论信号函数还是槽函数,返回值一般都是void类型,参数可以自定义,参数的目的就是为了传递信息
  • 包含信息与槽定义的类体
class Widget : public QWidget
{
    Q_OBJECT        //信号与槽的元对象


signals:
    void my_signal();          //自定义信号函数


public slots:
    void my_slot();            //自定义的槽函数


public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


private:
    Ui::Widget *ui;
};

信号与槽的连接

  • 在ui界面下的信号与槽的编辑处进行连接,该连接方式只能发射系统提供的信号,并使用系统提供的槽函数
  • 在ui界面的组件上,右键转到槽,选择信号,槽函数逻辑需要自行书写

qt4版本的连接函数(书写错误不会报错)

[static] QMetaObject::Connection           //返回值是一个连接,并且该函数是一个静态成员函数
    QObject::connect(                      //函数名
        const QObject *sender,             //信号的发射者,是组件的指针
        const char *signal,                //要发射的信号是一个C语言风格的字符串,将信号函数传递进来时,需要使用SIGNAL宏进行转换
        const QObject *receiver,           //信号的接受者,是组件的指针
        onst char *method)                 //处理信号的槽函数,是C风格字符串,将槽函数传递进来时,需要使用SLOT宏进行转换
注意:信号函数必须是信号的发射者所在的类中有的信号函数,而槽函数也必须是信号的接受者中有的槽函数
举个例子:
  QLabel *label = new QLabel;
  QScrollBar *scrollBar = new QScrollBar;
  QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                   label,  SLOT(setNum(int)));

qt5版本的连接函数

[static] QMetaObject::Connection           //返回值是一个连接,并且该函数是一个静态成员函数
    QObject::connect(                   //函数名
        const QObject *sender,              //信号的发射者,是组件的指针
        PointerToMemberFunction signal,     //信号函数的函数指针变量,直接填写函数名即可
        const QObject *receiver,           //信号的接受者,是组件的指针
        PointerToMemberFunction method)    //槽函数的函数指针变量,直接填写函数名即可
        
举个例子:
  QLabel *label = new QLabel;
  QLineEdit *lineEdit = new QLineEdit;
  QObject::connect(lineEdit, &QLineEdit::textChanged,
                   label,  &QLabel::setText);

信号连接外部函数或lambda表达式

[static] QMetaObject::Connection                //返回值是一个连接,并且该函数是一个静态成员函数
    QObject::connect(                 //函数名
        const QObject *sender,            //信号的发射者,是组件的指针
        PointerToMemberFunction signal,      //信号函数的函数指针变量,直接填写函数名即可
        Functor functor)                 //处理信号的功能函数,可以是全局函数,也可以是lambda表达式

举个例子:
  void someFunction();
  QPushButton *button = new QPushButton;
  QObject::connect(button, &QPushButton::clicked, someFunction);


Lambda 表达式作为槽函数:

  QByteArray page = ...;
  QTcpSocket *socket = new QTcpSocket;
  socket->connectToHost("qt-project.org", 80);
  QObject::connect(socket, &QTcpSocket::connected, [=] () {
          socket->write("GET " + page + "\r\n");
      });

断开信号与槽的连接

只需将上面的连接函数前加dis即可,参数都不变

发射自定义信号

  • 在自定义类体内的signals权限下,定义自定义的信号函数,返回值为void,可以有参数,也可以没参数
  • 在程序所需处,使用关键字emit发射自定义的信号:emit 信号名(实参列表);
  • 将自定义的信号与槽函数进行连接
  • 当自定义的信号发射后,槽函数会立即响应

信号与槽函数总结

  • 一个信号可以连接到多个槽函数中,当信号被发射后,与之连接的所有槽函数都会被执行
  • 一个槽函数可以连接多个信号函数,但凡其中一个信号被发射,那么槽函数就会被执行
  • 一个信号函数,也可以连接到另一个信号函数上,表明当一个信号发射时,后一个信号跟着被发射

信号函数与槽函数参数个数总结

    1、信号函数和槽函数进行链接时,一般要求信号函数和槽函数的参数保持一致
        connect(信号发送者, SIGNAL(signalFun()),信号接收者, SLOT(slotFun()));     //Ok
        connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int)));     //Ok
        connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(int, char)));     //Ok
        connect(信号发送者, SIGNAL(signalFun(char, int)),信号接收者, SLOT(slotFun(int, char)));     //False
        connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(char)));     //False
    2、当信号函数的参数大于槽函数的参数时
        connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun()));     //Ok
        connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(int)));     //Ok
        connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(char)));     //False
    3、当信号函数的参数小于槽函数的参数时
        connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int, char)));     //False
        connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int, char=0)));     //Ok

练习

完成登录框的按钮操作,并在登录成功后进行界面跳转
.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
signals:
    void my_signal();
    void jump();
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void my_slot();
    void on_clicked();
private:
    Ui::MainWindow *ui;
    QPushButton *btn1;
    QPushButton *btn2;
    QLabel *lab1;
    QLineEdit * edit1;
    QLineEdit * edit2;
};
#endif // MAINWINDOW_H



/*********************************************************************/
//第二个界面
#ifndef FORM_H
#define FORM_H

#include <QWidget>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = nullptr);
    ~Form();

public slots:
    void jump_slot();

private:
    Ui::Form *ui;
};

#endif // FORM_H

.cpp文件

#include "mainwindow.h"

#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <cstring>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)

{

    //设置窗口
    this->resize(540,410); //设置窗口大小
    this->setWindowTitle("奕书聊天室");//设置窗口标题
    this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));
    //设置登录按钮组件
    btn1 = new QPushButton(QIcon(":/login.png"),
                                               "登录",
                                               this);//设置按钮组件的图标,文本内容,和让其在当前界面显示
    btn1->move(240,340);  //设置按钮组件的位置
    btn1->resize(80,40);  //设置按钮组件的大小
   // btn1->setEnabled(false); //设置按钮不可点击

    //连接登录按钮
    connect(btn1,&QPushButton::clicked, this, &MainWindow::my_slot);
    connect(btn1,&QPushButton::clicked, this, &MainWindow::on_clicked);
    //设置取消按钮组件
    btn2 = new QPushButton(QIcon(":/cancel.png"),
                                               "取消",
                                               this);//设置按钮组件的图标,文本内容,和让其在当前界面显示
    btn2->move(340,340);
    btn2->resize(80,40);
   // btn2->setEnabled(false);

    //连接取消登录按钮
    connect(btn2,SIGNAL(pressed()),this,SLOT(close()));
    //设置LOGO
    lab1 = new QLabel(this);
    lab1->setPixmap(QPixmap(":/logo.png"));
    lab1->resize(540,180);
    lab1->setScaledContents(true);
    //设置行编辑器 账号
    edit1 = new QLineEdit(this);
    edit1->resize(220,40);
    edit1->move(180,220);
    edit1->setPlaceholderText("QQ号码/手机/邮箱");//设置占位符
    //edit1->setEchoMode(QLineEdit::Password);
    //设置行编辑器 密码
    edit2 = new QLineEdit(this);
    edit2->resize(220,40);
    edit2->move(180,280);
    edit2->setPlaceholderText("密码");//设置占位符
    edit2->setEchoMode(QLineEdit::Password);//设置密文显示
    //设置账号的LOGO
    QLabel *lab2 = new QLabel(this);
    lab2->setPixmap(QPixmap(":/userName.jpg"));
    lab2->resize(50,40);
    lab2->move(edit1->x()-85,edit1->y());
    lab2->setScaledContents(true); //设置图片内容自适应
    //设置账号的LOGO
    QLabel *lab3 = new QLabel(this);
    lab3->setPixmap(QPixmap(":/passwd.jpg"));
    lab3->resize(50,40);
    lab3->move(edit2->x()-85,edit2->y());
    lab3->setScaledContents(true); //设置图片内容自适应
}
MainWindow::~MainWindow()
{

}

void MainWindow::my_slot()
{
    if(edit1->text()=="admin" && edit2->text()=="123456")
    {
        qDebug()<<"登录成功";
        this->close();
    }
    else
    {
        qDebug()<<"登录失败";
        edit2->clear();
    }
}
void MainWindow::on_clicked()
{
    emit jump();
}



/********************************************************************/
//第二个界面
#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
}

Form::~Form()
{
    delete ui;
}

void Form::jump_slot()
{
    this->show();
}

面试小测

多态,虚函数,纯虚函数

  • 类的三大属性:多态,封装,继承;多态也就是一种形式的多种状态,多态又分为静态多态和动态多态,函数重载时就属于静态多态,而运行时属于动态多态;多态又是父类的指针或者引用指向或初始化子类对象,调用子类对父类重写的函数,进而展开子类的功能

  • 虚函数用virtual修饰的函数即为虚函数,当类中存在虚函数,那么该类中就会有一个虚指针,虚指针指向虚函数表,虚函数表中记录了所有虚函数以及子类对父类重写的函数。

  • 纯虚函数:当父类中的虚函数没有实际意义时,可将该虚函数设置为纯虚函数,含有纯虚函数的类被称为抽象类,抽象类不能实例化对象,当子类没有对父类的纯虚函数进行重新时,子类也被称为抽象类。文章来源地址https://www.toymoban.com/news/detail-691166.html

将“引用”作为函数参数有哪些特点

  • 函数参数是程序间数据交互的桥梁,一般分为值传递和地址传递。值传递,传递的是值,不改变值原本的大小。地址传递,传递的是地址,当通过地址访问到其地址所指向的内容时,其内容可以发生改变。引用的实质为取别名,一旦确定指向不能更改。使用引用作为函数参数时,不需要重新开辟空间,效率高,通过引用可直接改变其对应的内容。当引用不想被改变的变量时,可使用const修饰,此时为常引用,常引用不能修改值的大小。

结构与联合的区别

  • 结构体与联合体都是构造数据类型,都是由相同或不同的数据类型构造而成。但是结构体每个成员地址连续,结构体大小由每个成员的字节大小字节对齐原则决定。而联合体大小由其成员中字节最大的决定,所有成员共用一片空间。

到了这里,关于QT中信号与槽机制的介绍,以及信号与槽连接的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【python】软件开发——PyQt5、Qt Designer、信号与槽机制、计算器实现

    PyQt5 是一个基于 Python 的 GUI 框架,用于创建跨平台的桌面应用程序。它是 Qt 库的 Python 绑定,结合了 Python 的简洁和易用性以及 Qt 框架的强大功能。 Qt 是一个流行的 C++ 跨平台应用程序开发框架,提供了丰富的图形界面组件、网络通信、数据库访问、多线程等功能。PyQt5 允许

    2024年02月04日
    浏览(44)
  • OceanBase—01(入门篇——使用docker安装OceanBase以及介绍连接OB的几种方式)

    1.1.1 安装前提 安装了docker Linux下安装docker以及docker安装Oracle19c的全部详细过程及各种问题解决. 1.1.2 参考 参考官网: 使用 Docker 部署 OceanBase 数据库. 提示:这是安装之后的操作,需要的话可以,安装之后可以跳到这里看修改密码!!! 安装后默认密码为空,可以修改也可以

    2024年02月09日
    浏览(47)
  • RabbitMQ的几种消息确认机制详细介绍

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍RabbitMQ的几种消息确认机制。 如果文章有什么需要改进的地方还请大佬不吝赐教 👏👏。 小威在此先感谢各位大佬啦~~🤞🤞 🏠个人主页:小威要向诸佬学习呀 🧑个人简介:大家好,我是

    2023年04月25日
    浏览(55)
  • 05 信号与槽机制

    信号(Signal) :         信号的本质是事件,例如鼠标点击,窗口刷新,键盘输入等 槽(Slot) :         槽的本质是信号对应的函数,可以有参,可以发生重载 信号与槽机制的优点 : 松散耦合  

    2024年02月17日
    浏览(41)
  • 信号与槽机制

    信号和槽是用于对象之间的通信,它是Qt的核心机制,在Qt编程中有着广泛的应用。如果想学好Qt,一定要充分掌握信号的槽的概念与使用。 在Qt中,发送对象、发送的信号、接收对象、槽可以通过很多种方式连接。下面通过一些例子逐一做演示,如下: 2.1、Qt4使用宏 在Qt4及

    2024年02月03日
    浏览(28)
  • 8.31 加载资源文件 信号与槽机制

     登录窗口 主函数  登录成功后的窗口  登录失败后的窗口

    2024年02月10日
    浏览(38)
  • QT 信号与槽

     .h文件 .cpp文件 现象

    2024年02月02日
    浏览(41)
  • 2、QT的信号与槽

    connect(信号的发送者,SIGNAL(信号名称),信号的接收者,SLOT(槽函数)); QT 4 的写法 QT 5的写法 控件生成信号定义: ①、在需要接收信号的类中 声明槽函数 ②、在xxx.cpp 中实现槽函数 ③、进行信号与槽的关联 用户自定义信号: ①、在信号的发送者类中声明信号 ②、关联信号与槽

    2024年02月10日
    浏览(43)
  • QT基础【5-信号与槽】

    🌈个人主页:godspeed_lucip 🔥 系列专栏:QT从基础到进阶 推荐使用这种写法,信号名字、槽函数名字写错了,编译器会直接报错 参数解释: 第一个参数:信号的发出者 第二个参数:发出的信号 第三个参数:信号的接受者 第四个参数:处理的槽函数 效果: 信号槽机制不只在

    2024年02月21日
    浏览(42)
  • QT的核心——信号与槽

    目录 回顾C 语言信号 1、信号与槽 2、关联信号与槽 2.1自动关联信号与槽 2.2手动关联信号与槽 2.3断开信号与槽 3、自定义信号 3.1自定义信号使用条件 3.2自定义槽函数使用条件 4、信号与槽参数传递 4.1自定义一个带参的信号 4.2关联带参的信号与槽 4.3发送一个带参的信号 5、信

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包