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()));     //Okconnect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int)));     //Okconnect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(int, char)));     //Okconnect(信号发送者, SIGNAL(signalFun(char, int)),信号接收者, SLOT(slotFun(int, char)));     //Falseconnect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(char)));     //False2、当信号函数的参数大于槽函数的参数时connect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun()));     //Okconnect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(int)));     //Okconnect(信号发送者, SIGNAL(signalFun(int, char)),信号接收者, SLOT(slotFun(char)));     //False3、当信号函数的参数小于槽函数的参数时connect(信号发送者, SIGNAL(signalFun(int)),信号接收者, SLOT(slotFun(int, char)));     //Falseconnect(信号发送者, 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_NAMESPACEclass 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_OBJECTpublic: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()));//设置LOGOlab1 = 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);//设置密文显示//设置账号的LOGOQLabel *lab2 = new QLabel(this);lab2->setPixmap(QPixmap(":/userName.jpg"));lab2->resize(50,40);lab2->move(edit1->x()-85,edit1->y());lab2->setScaledContents(true); //设置图片内容自适应//设置账号的LOGOQLabel *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修饰的函数即为虚函数,当类中存在虚函数,那么该类中就会有一个虚指针,虚指针指向虚函数表,虚函数表中记录了所有虚函数以及子类对父类重写的函数。

  • 纯虚函数:当父类中的虚函数没有实际意义时,可将该虚函数设置为纯虚函数,含有纯虚函数的类被称为抽象类,抽象类不能实例化对象,当子类没有对父类的纯虚函数进行重新时,子类也被称为抽象类。

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

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

结构与联合的区别

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9.4 【C语言】用指针处理链表

9.4.1 什么是链表 它是动态地进行存储分配的一种结构。 链表中各元素在内存中的地址是不连续的。要找某一元素&#xff0c;必须先找到上一个元素&#xff0c;根据它提供的下一元素地址才能找到下一个元素。 如果不提供“头指针”&#xff0c;则整个链表无法访问。 9.4.2 建…

C++算法 —— 动态规划(1)斐波那契数列模型(包含动规思路总介绍)

文章目录 1、动规思路简介2、第N个泰波那契数列3、三步问题4、使用最小花费爬楼梯5、解码方法 1、动规思路简介 动规的思路有五个步骤&#xff0c;且最好画图来理解细节&#xff0c;不要怕麻烦。当你开始画图&#xff0c;仔细阅读题时&#xff0c;学习中的沉浸感就体验到了。 …

Linux常用命令——cupsdisable命令

在线Linux命令查询工具 cupsdisable 停止指定的打印机 补充说明 cupsdisable命令用于停止指定的打印机。 语法 cupsdisable(选项)(参数)选项 -E&#xff1a;当连接到服务器时强制使用加密&#xff1b; -U&#xff1a;指定连接服务器时使用的用户名&#xff1b; -u&#…

git的常用命令

初始化git&#xff0c;以及如何提交代码 1、配置用户信息 git config --global user.name zhangsan # 设置用户签名 git config --global user.email zhangsanqq.com # 设置用户邮箱&#xff08;不会验证&#xff0c;可以不存在&#xff09;1.1、查看是否已经添加用户配置 在…

长城网络靶场,第一题笔记

黑客使用了哪款扫描工具对论坛进行了扫描&#xff1f;&#xff08;小写简称&#xff09; 第一关&#xff0c;第三小题的答案是awvs 思路是先统计查询 然后过滤ip检查流量 过滤语句&#xff1a;tcp and ip.addr ip 114.240179.133没有 第二个101.36.79.67 之后找到了一个…

前端 CSS - 如何隐藏右侧的滚动条 -关于出现过多的滚动条导致界面不美观

1、配置 HTML 标签&#xff0c;隐藏右侧的滚动条 CSS 配置&#xff1a;下面两个一起写进进去&#xff0c;适配 IE、火狐、谷歌浏览器 html {/*隐藏滚动条&#xff0c;当IE下溢出&#xff0c;仍然可以滚动*/-ms-overflow-style:none;/*火狐下隐藏滚动条*/overflow:-moz-scroll…

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。

LeetCode第73题矩阵置零 1.思路&#xff1a; 想到一个开辟一点空间来解决方法&#xff0c;使用哈希集。就是使用一个哈希集&#xff08;row和col&#xff09;来储存数组中的元素为0的下标。然后再遍历&#xff0c;整个二维数组&#xff0c;在哈希集中存在对应的下标&#xff0c…

可扩展的Blender插件开发汇总

成熟的 Blender 3D 插件是令人惊奇的事情。作为 Python 和 Blender 的新手,我经常发现自己被社区中的人们创造的强大的东西弄得目瞪口呆。坦率地说,其中一些包看起来有点神奇,当自我怀疑或冒名顶替综合症的唠叨声音被打破时,很容易想到“如果有人能做出可以做xxx的东西就好…

AI:06-基于OpenCV的二维码识别技术的研究

二维码作为一种广泛应用于信息传递和识别的技术,具有识别速度快、容错率高等优点。本文探讨如何利用OpenCV库实现二维码的快速、准确识别,通过多处代码实例展示技术深度。 二维码作为一种矩阵型的条码,广泛应用于各个领域,如商品追溯、移动支付、活动签到等。二维码的快速…

初识Kafka

kafka 第一章、初识Kafka 原先&#xff1a; kafka&#xff0c;由LinkedIn公司采用Scala语言开发的一个多分区&#xff0c;多副本&#xff0c;基于Zookeeper协调的分布式消息系统&#xff0c;被捐献给Apache基金会。 现在 分布式流式处理平台。 高吞吐 可持久化 可水平扩展 …

Conda环境配置常用

常用命令 pip list 查看pip安装的包 conda list pip show numpy 查看包的详细信息 Conda环境配置 conda env list 查看已有的虚拟环境 conda activate my_test 切换到想要的虚拟环境 conda activate 激活canda环境 python -V #注意V是大写&#xff0c;即可查看Pytho…

Java BIO、NIO、AIO学习总结

前言&#xff1a;关于BIO/NIO/AIO的文章已经汗牛充栋&#xff0c;俺最近比较闲试图系统学习一下&#xff0c;希望大侠多多指教&#xff01; 先来个例子理解一下概念&#xff0c;以银行取款为例&#xff1a; 同步 &#xff1a; 自己亲自出马持银行卡到银行取钱&#xff08;使用…

[SWPUCTF 2022]——Web方向 详细Writeup

SWPUCTF 2022 ez_ez_php 打开环境得到源码 <?php error_reporting(0); if (isset($_GET[file])) {if ( substr($_GET["file"], 0, 3) "php" ) {echo "Nice!!!";include($_GET["file"]);} else {echo "Hacker!!";} }e…

01-为什么阿里巴巴强制要求使用包装类型定义属性?【Java面试题总结】

1.为什么阿里巴巴强制要求使用包装类型定义属性&#xff1f; 我认为主要有以下几个方面的原因&#xff1a; 默认值问题&#xff1a;使用基本数据类型定义属性时&#xff0c;如果没有给属性赋初始值&#xff0c;会使用默认值&#xff08;如 int 的默认值为 0&#xff09;&…

linux安装minio以及springboot整合使用

文章目录 1.linux安装minio2.springboot整合minio使用 1.linux安装minio 1.新建文件夹 mkdir /home/minio # 数据文件夹 mkdir /home/minio/data # 创建日志文件夹 mkdir /home/minio/log2.进入文件夹 cd /home/minio3.下载minio&#xff0c;链接可从官网获取 wget https://…

C++——string使用

string的常见构造接口 string() 构造空的srting类对象&#xff0c;空字符串 string(const char* str) 用字符串初始化 string(const string& str)拷贝构造&#xff0c;使用string类初始化string(size_t n, char c) 用n个字符c初始化 string s1; string s2("hello …

【Terraform学习】使用 Terraform创建DynamoDB添加项目(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

4.1 链式栈StackT

C关键词&#xff1a;内部类/模板类/头插 C自学精简教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; 栈的内存结构 空栈&#xff1a; 有一个元素的栈&#xff1a; 多个元素的栈&#xff1a; 成员函数说明 0 clear 清空栈 clear 函数负责将栈的对内存释放…

使用Go env命令设置Go的环境

文章目录 前言Linux的设置Windlows设置Go version > 1.13 当你的GO的版本大于1.13的时候 Set environment variable allow bypassing the proxy for selected modules 前言 在进行Go开发的时候&#xff0c;设置Go的环境变量信息是必须的。下面介绍windows和Linux&#xff0…

mysql怎么查包含指定字段的所有表

查找包含特定字段的所有表&#xff0c;你可以使用 INFORMATION_SCHEMA.COLUMNS 表。以下是一个查询示例&#xff0c;用于在 MySQL 中找到所有包含名为 column_name 的字段的表&#xff1a; SELECT table_schema, table_name FROM INFORMATION_SCHEMA.COLUMNS WHERE column_na…