qt学习:多界面跳转+信号+槽函数

目录

概念

分类

多界面编程思路

新建界面

注意

头文件

无数据传输跳转界面

有数据传输跳转界面   对象公有接口

界面之间数据传输

信号与槽函数进行数据传输跳转界面

信号:

槽:

概念

格式1  关联信号和发送信号

格式2

通信步骤    自定义信号和槽函数

总结

实例  制作一个教务管理系统

第一步,新建一个Mainwindow类界面项目,配置ui,修改三个输入框的名字​编辑

第二步,设置Mainwindow类界面里的教师按钮的点击事件

第三步,新建一个teacherwindow类界面,配置ui界面和按钮点击事件,并在teacherwindow类界面里定义槽函数和自定义信号

第四步,新建一个setwindow类界面,配置ui界面和按钮点击事件,并在setwindow类界面里定义槽函数和自定义信号

第五步,定义Mainwindow类界面要发送的自定义信号和编写按钮点击事件

自定义信号

教师按钮点击事件

第六步,编写teacherwindow类界面和setwindow类界面里的槽函数和按钮点击事件

teacherwindow类界面

setwindow类界面


概念

实现多界面跳转

分类

  • 无数据传输跳转
  • 有数据传输跳转

多界面编程思路

  1. 创建另一个界面的对象
  2. 显示要跳转的界面
  3. 关闭或者隐藏当前的界面

一个界面的本质上就是一个类的对象,但是界面的显示和关闭完全由程序设计者维护,并不是由系统维护,所以界面对象的创建在堆空间上申请内存

新建界面

点击项目,右键,选择add new...,左边选择Qt,中间选择Qt设计师界面类,点击下一步,两个选一个,第一个首界面是QWidget,后面要跳转的界面都选QMainWindow

 再点击下一步,修改界面类名

注意

第一个设置的登录界面一定是 QWidget基类,否则界面跳转传递父窗口 一定会闪退。比如父窗口是QMainWindow,子窗口是QWidget,无法进行多界面跳转。而且建议第二个界面和后面的界面是QMainWindow基类

头文件

要包含新界面的头文件

无数据传输跳转界面

//跳转新界面不能回来原来界面
//先新建一个界面MWindow类
//跳转到另一个界面,然后关闭当前界面
void Loginwidget::on_btn1_clicked()//按钮点击函数
{//第一步:创建另一个界面的对象// new Mainwindow 说明创建新界面对象跟当前界面没有关联,不记录它是从哪个界面跳转而来 MainWindow *mainWidget = new MainWindow;//关闭之后自动销毁对象mainwidget->setAttribute(Qt::WA DeleteOnClose);//第二步:显示要跳转的界面mainWidget->show();//第三步:关闭当前的界面,跳转到另一个界面之后,就不能返回原来的界面了this->close();
}
//--------------------------------------
//跳转新界面能回来原来界面
//先新建一个界面MWindow类
//跳转到另一个界面,然后关闭当前界面
void Loginwidget::on_btn2_clicked()//按钮点击函数
{//第一步:创建另一个界面的对象// new MainWindow(this)把父窗口传递过去,记录从哪一个界面跳转//跳转的窗口可以设置按钮重新跳转回这个界面MainWindow *mainWidget = new MainWindow(this);//关闭之后自动销毁对象mainwidget->setAttribute(Qt::WA DeleteOnClose);//第二步:显示要跳转的界面mainWidget->show();//第三步:隐藏当前的界面,跳转到另一个界面之后,点击返回按钮还可以返回当前界面this->hide();
}//新界面的返回按钮
void Mainwindow::on_backbtn_clicked()
{//因为在跳转时,记录了上一个界面//所以可以利用此函数获取当前窗口的父窗口对象指针Qwidget *parent = this->parentWidget();qDebug()<<"parent addr:"<<parent;//把之前父界面的隐藏状态改为显示状态,显示父界面parent->show();//关闭当前界面this->close();//销毁子界面//delete this; //如果设置了自动销毁,则不需要手动delete
}

有数据传输跳转界面   对象公有接口

界面之间数据传输

原理:就是不同界面本质上就是不同的类对象,也就是说不同类对象之间的数据传输。在一个类中定义一个公有的接口,在另一个类的接口函数中,通过类对象调用公有接口,传入对应的参数值

//新建一个界面MainWindow类
//跳转到新界面
void Loginwidget::on_btn1_clicked()
{//第一步:创建另一个界面的对象,并把本身界面的地址传给新界面MainWindow *mainWindow = new MainWindow(this);//关闭界面的时候自动释放内存mainWindow->setAttribute(Qt::WA DeleteOnClose)://传输数据 --调用公有函数成员实现数据传输mainWindow->setIP(ui->iplineEdit->text());//获取本界面的输入框的数据并传输mainWindow->setPort(ui->portlineEdit->text());//获取本界面的输入框的数据并传输//第二步:显示要跳转的界面mainWindow->show();//第三步:隐藏当前的界面this->hide();
}//新界面
//这个函数是在另一个类中被调用 用来传输数据
void Mainwindow::setIP(QString ip) 
{ui->iplabel->setText(ip);//当前界面的输入框写入数据
}
//这个函数是在另一个类中被调用 用来传输数据
void Mainwindow::setPort(QString port)
{ui->portlabel->setText(port);//当前界面的输入框写入数据
}
//返回按钮
void Mainwindow::on_pushButton_clicked()
{//获取原先界面的地址Qwidget *parent = this->parentwidget();//显示原先界面parent->show();//关闭当前界面this->close();
}

信号与槽函数进行数据传输跳转界面

信号:

本质上也是一个函数,可以使用系统预定义的信号,开发者也可以自定义信号,如果自定义信号,该信号只需要声明(类中),并不需要实现

槽:

本质上也是一个函数,可以使用系统预定义的槽,开发者也可以自定义槽,如果自定义槽,该槽需要声明(类中)并需要实现

概念

  • 信号与槽函数机制是QT编程的基础也是QT的一大创新,是通过QT的元对象系统实现。
  • 信号(Signal)就是在特定条件下被发射的事件。比如QPushButton 最常见的信号就是鼠标单击时发射clicked()信号。当信号被发射出去之后,很多时候我们需要对这个信号进行响应处理,对信号进行响应的函数称之为 槽函数,槽函数跟一般的函数用法一样,只不过槽函数可以跟信号进行关联。当信号被发射时,槽函数将会自动执行。
  1. 信号-----------函数,该函数不需要实现
  2. 槽函数----------函数,该函数需要实现,实现自己的功能

格式1  关联信号和发送信号

QMetaObject::Connection QObject::connect
(const QObject *sender,//信号的发送者const char *signal,//发送什么信号const QObect *receiver,//接收者const char *method,//接收者的槽函数(信号响应函数)Qt::ConnectionType = Qt::AutoConnection//连接的类型,默认自动连接
)

Connection 函数是QObject类的一个静态函数,不过QObject类是所有Qt类的基类,在实际调用时可以忽略前面的限定符。        

//当你在本界面新建一个按钮,然后建立点击函数,会自动关联点击信号
//也可以手动关联
connect
(ui->btn1,//信号发送者指针,本界面的按钮发送的信号&QPushButton::clicked,//按钮发送的信号,点击信号,已经定义好了this,//接收者对象指针,自己接收&Widget::on_btn1_clicked//接受者的槽函数,点击事件函数
);void Widget::on_btn1_clicked()
{qDebug()<<"1";//也可以自己发送自定义信号,sendSignals是自定义信号,//格式如下,emit 信号;emit sendSignals("自定义数据");
}

格式2

格式
Connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
SIGNAL表示宏函数,括号里是信号,信号有参数就要加参数
SLOT表示槽函数,括号里是槽函数,槽函数有参数就要加参数//比如
Connect(this,SIGNAL(sendIPSignal(QString)),mainWindow,SLOT(on_getIP(QString)));
//sendIPSignal(QString)是自定义信号
//on_getIP(QString)是自定义槽函数

通信步骤    自定义信号和槽函数

第一步:在LoginWidget类(旧界面)中自定义 或者 使用系统预定义好的信号,谁发送信号就在哪定义

class LoginWidget:public QWidget
{Q_OBJECT//如果是自定义的类,想要支持信号和槽的操作,必须要加上宏//[2] 声明这个宏,来说明要使用信号和槽
public:LoginWidget(QWidget *parent = nullptr);~LoginWidget();private slots://代表下面是槽函数void on_btn1_clicked();signals://表示下面是自定义信号  不需要实现,只用声明,可以发送数据void sendIPSignal(QString ip);private:Ui::sendIPSignal(QString ip);
}

第二步:在MainWindow类(新界面)中定义槽函数(类内声明类外实现),谁接收就在谁那定义槽函数

class MainWindow : public QMainWindow
{Q_OBJECT//如果是自定义的类,想要支持信号和槽的操作,必须要加上宏//[2] 声明这个宏,来说明要使用信号和槽private slots://表示下面是槽函数void on_getIP(QString ip);//类内声明类外定义
}//类外实现
void on_getIP(QString ip)
{qDebug()<<ip;
}

第三步:在LoginWidget类(旧界面)中关联信号

connect(this,&LoginWidget::sendIPSignal,widget,MainWindow::on_getIP);
//this表示是自己发送信号
//&LoginWidget::sendIPSignal表示发送的是什么信号,LoginWidget是旧界面
//widget是MainWindow *widget定义的对象,就是新界面的对象
//MainWindow::on_getIP表示槽函数,定义在新界面里

第四步:在LoginWidget类(旧界面)中发送自定义信号

//发送名为sendIPSignal的信号,信号有参数
emit sendIPSignal("想要传的数据");

总结

  • 信号和槽中,槽函数的调用是通过信号来完成,所以槽函数的参数类型要跟信号函数的参数类型保持一致,槽的参数个数不大于信号的参数个数
  • 槽函数的调用,必须要跟对应的信号建立连接关系,通过connect函数来实现连接
  • 个信号可以跟多个槽函数相关联
  • 多个信号可以执行同一个槽函数
  • 个信号可以跟另一个信号相关联
  • 使用信号与槽函数机制必须在类的声明中添加Q OBJECT宏,因为只有标记该宏的头文件才能让元对象编译器去处理。

实例  制作一个教务管理系统

教务管理系统需求描述: 教务管理系统,用户可以选择教师或者学生角色进行系统,当教师登录时,可以将教师信息传输到教师界面显示,同时,程序还可以对教师信息可进行修改设置并保存,将保存的信息显示在教师界面。

第一步,新建一个Mainwindow类界面项目,配置ui,修改三个输入框的名字

 

第二步,设置Mainwindow类界面里的教师按钮的点击事件

第三步,新建一个teacherwindow类界面,配置ui界面和按钮点击事件,并在teacherwindow类界面里定义槽函数和自定义信号

//槽函数
public slots:void onRecvDataSlot(QString name,QString classes,QString works);
//自定义信号
signals:void sendDataSignal(QString name,QString classes,QString works);

第四步,新建一个setwindow类界面,配置ui界面和按钮点击事件,并在setwindow类界面里定义槽函数和自定义信号

//槽函数
public slots:void onRecvDataSlot(QString name,QString classes,QString works);
//自定义信号
signals:void sendDataSignal(QString name,QString classes,QString works);

第五步,定义Mainwindow类界面要发送的自定义信号和编写按钮点击事件

自定义信号

signals:void sendDataSignal(QString name,QString classes,QString works);

教师按钮点击事件

#include <QMessageBox>//弹窗头文件
#include "teacherwindow.h"//教师界面头文件
//教师按钮信号
void MainWindow::on_btn_teacher_clicked()
{//1、获取当前界面上输入框的数据QString name = ui->lineEdit_name->text();QString classes = ui->lineEdit_classes->text();QString works = ui->lineEdit_work->text();//2、判断数据是否为空,空就弹窗if(name.isEmpty() || classes.isEmpty() || works.isEmpty()){//加入头文件//设置弹窗QMessageBox::warning(this,"消息","不能为空");return;}//3、创建教师界面对象,并设置退出自动释放teacherWindow *teawidget = new teacherWindow(this);teawidget->setAttribute(Qt::WA_DeleteOnClose);//信号在当前界面定义,槽函数在教室界面定义//4.1、在教师界面定义槽函数进行关联,//this本界面发送//&MainWindow::sendDataSignal当前界面定义的信号//teawidget接收的界面//&teacherWindow::onRecvDataSlot接收界面的槽函数connect(this,&MainWindow::sendDataSignal,teawidget,&teacherWindow::onRecvDataSlot);//4.2、发送当前界面的数据传输到教师界面,发送sendDataSignal自定义信号,在当前界面定义emit sendDataSignal(name,classes,works);//5、显示另一个界面teawidget->show();//6、隐藏当前界面this->hide();
}

第六步,编写teacherwindow类界面和setwindow类界面里的槽函数和按钮点击事件

teacherwindow类界面

//头文件
#include <QMessageBox>//弹窗头文件
#include "setwindow.h"//设置界面头文件//槽函数
void teacherWindow::onRecvDataSlot(QString name, QString classes, QString works)
{//将数据显示到输入框里ui->lineEdit_name->setText(name);ui->lineEdit_classes->setText(classes);ui->lineEdit_work->setText(works);
}//按钮点击事件
void teacherWindow::on_SetButton_clicked()
{//1、获取当前界面上的数据QString name = ui->lineEdit_name->text();QString classes = ui->lineEdit_classes->text();QString works = ui->lineEdit_work->text();//2、判断数据是否为空,空就弹窗if(name.isEmpty() || classes.isEmpty() || works.isEmpty()){//加入头文件#include <QMessageBox>//弹窗头文件//设置弹窗QMessageBox::warning(this,"消息","不能为空");return;}//3、创建设置界面对象,并设置退出自动释放setWindow *setwidget = new setWindow(this);setwidget->setAttribute(Qt::WA_DeleteOnClose);//4.1、在设置界面定义槽函数进行关联connect(this,//当前界面发送的数据SIGNAL(sendDataSignal(QString,QString,QString)),//用宏来表示发送什么信号setwidget,//接收的界面SLOT(onRecvDataSlot(QString,QString,QString))//接收界面的槽函数);//4.2、发送当前界面的数据传输到设置界面,发送sendDataSignal自定义信号,在当前界面定义emit sendDataSignal(name,classes,works);//5、显示另一个界面setwidget->show();//6、隐藏当前界面this->hide();
}

setwindow类界面

//槽函数
void setWindow::onRecvDataSlot(QString name, QString classes, QString works)
{ui->lineEdit_name->setText(name);ui->lineEdit_classes->setText(classes);ui->lineEdit_work->setText(works);
}//按钮点击事件,返回上一级或者上上一级的界面
void setWindow::on_SuccessButton_clicked()
{//返回教师界面//获取教师界面对象QWidget *widget = this->parentWidget();//获取当前界面上的数据QString name = ui->lineEdit_name->text();QString classes = ui->lineEdit_classes->text();QString works = ui->lineEdit_work->text();//关联 在上一个界面关联返回的信号,写在上一个界面的点击按钮事件里//connect(setwidget,&setWindow::sendDataSignal,this,&teacherWindow::onRecvDataSlot);    //发送信号emit sendDataSignal(name,classes,works);widget->show();this->close();//返回第一个界面//获取第一个界面对象
//    QWidget *widget1 = this->parentWidget()->parentWidget();
//    widget1->show();
//    this->close();
}

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

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

相关文章

精彩手绘全解:RAG技术,从入门到精通

本文整理自IVAN ILIN发布于Towards AI的博客[1]。感谢作者的精彩讲解。 深度学习自然语言处理 分享整理&#xff1a;Winnie 引言 检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;简称RAG&#xff09;为大型语言模型&#xff08;LLMs&#xff09;提供了从某…

绘图工具用的好,头发掉的少

程序员不管是在学习&#xff0c;还是工作过程中&#xff0c;很多时候都需要画图&#xff0c;如产品分析、架构设计、方案选型等&#xff0c;良好的绘图不仅可以让绘图者的思路清晰&#xff0c;也可以让聆听者更好的理解。用好画图&#xff0c;升职加薪少不了&#xff01;今天介…

C程序训练:与输入有关的错误

在录入程序时有时稍不注意就可能录入错误的字符导致程序运行结果出现错误&#xff0c;下面举例说明。 下面程序的运行结果是错的&#xff0c;但程序又没有错&#xff0c;到底问题出现在哪呢&#xff1f; #include <stdio.h> int main() {FILE *fp;int i, k, n;fpfopen(…

OceanBase 4.2特性解读:Show Trace全链路跟踪,助力快速问题定位与精准诊断

在分布式数据库环境下&#xff0c;慢 SQL 诊断是运维人员面临的一大挑战。在无法及时发现问题根本原因的情况下&#xff0c;可能会严重影响用户体验&#xff0c;甚至会导致业务服务不可用。相对于单机数据库&#xff0c;分布式数据库系统涉及多个节点、多组件的协同工作&#x…

Go语言认识

Go语言认识 1. Go语言的设计背景2. Go语言的历程3. Go语言对比分析4. Go语言未来的发展规划5. 要不要选择Go 关注 go博客 直接了解第一手资料。 go文档 了解go的全貌。 1. Go语言的设计背景 Go语言&#xff08;也称为Golang&#xff09;是由Google开发的一种编程语言。它的设计…

构建基于RHEL7(CentOS7)的OpenSSH9.5p1的RPM包和升级回退方案

本文适用&#xff1a;RHEL7系列&#xff0c;或同类系统(CentOS7等) 文档形成时期&#xff1a;2023年 因软件世界之复杂和个人能力之限&#xff0c;难免疏漏和错误&#xff0c;欢迎指正。 文章目录 环境准备安装依赖openssh-9.5p1-el7.spec内容构建RPM包下载安装前注意事项开启t…

SQL注入攻击

1.用java实现登录的检查 package jdbc1;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Scanner;public class Login {public static void main(String args[]){try(Connection connec…

Redis管道操作

文章目录 1. 问题提出2. 解决方案3. 案例演示4. 总结 1. 问题提出 如何优化频繁命令往返造成的性能瓶颈&#xff1f; Redis是一种基于C/S一级请求响应协议的TCP服务&#xff0c;一个请求会遵循一下步骤&#xff1a; 客户端向服务端发送命令分四步&#xff08;发送命令-> …

教程视频二维码怎么做?扫码学习使用技巧

现在购买商品时经常会发现使用手册或者包装上会印有相关的二维码&#xff0c;扫码可以查看产品介绍或者使用说明的视频教学。将需要展示的内容放到二维码中&#xff0c;让用户能够通过扫码了解内容详情&#xff0c;有效的降低成本而且方便用户获取内容。 那么如果想要制作视频…

中科星图——Landsat9_C2_SR大气校正后的地表反射率数据

数据名称&#xff1a; Landsat9_C2_SR 数据来源&#xff1a; USGS 时空范围&#xff1a; 2022年1月-2023年3月 空间范围&#xff1a; 全国 数据简介&#xff1a; Landsat9_C2_SR数据集是经大气校正后的地表反射率数据&#xff0c;属于Collection2的二级数据产品&#…

128基于matlab的粒子群优化算法寻找多元函数的最大值

基于matlab的粒子群优化算法寻找多元函数的最大值&#xff0c;可定义多元函数&#xff0c;变量区间范围&#xff0c;输出最大值条件下的变量值。程序已调通&#xff0c;可直接运行。 128matlab多元函数极值 (xiaohongshu.com)

Sectigo有几种泛域名SSL证书买一年送一个月

Sectigo是一家知名的数字证书颁发机构&#xff0c;提供了很多种类型的SSL证书&#xff0c;可以满足不同用户的需求。其中&#xff0c;泛域名SSL证书是一种常见的证书类型&#xff0c;可以同时保护主域名以及主域名下所有子域名。今天就随SSL盾小编了解Sectigo旗下有几种泛域名S…

【origin】负载牵引的Smith圆图

【origin】负载牵引的Smith圆图 1.从ADS导入数据到origin2.smith圆图3.扩展到多组线4.参考资料 1.从ADS导入数据到origin export导出为txt&#xff0c;得到的是幅相值&#xff0c;复制到excel如下图&#xff0c;有多根类似格式的线&#xff0c;只需要复制DE列到origin中 复制到…

腾讯云COS桶文件上传下载工具类

1&#xff0c;申请key和密钥 2&#xff0c;引入依赖 <dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.24</version></dependency>3&#xff0c;工具类 package com.example.activi…

怎么找微信服务器的IP地址

首先&#xff0c;让微信客户端在PC端运行&#xff0c;在任务管理器->详细信息中&#xff0c;找到WeChat.exe的进程&#xff0c;找到PID 就是微信进程的ID号&#xff0c;如下图所示&#xff1a; 打开一个命令行窗口&#xff0c;cmd或者powershell窗口都可以&#xff0c;输入…

筛选数据-第15届蓝桥第三次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第164讲。 第15届蓝桥杯第3次STEMA测评已于2023年12月17日落下帷幕&#xff0c;编程题一共有6题&#xff0c;分别如下&…

大数据之谷歌文件系统论文 GFS The Google File System

原文地址 谷歌文件系统论文 摘要 我们设计并实现了Google文件系统&#xff0c;这是一个面向大规模分布式数据密集型应用的可扩展分布式文件系统。 它在廉价的通用硬件上运行&#xff0c;提供了容错性&#xff0c;并向大量客户端提供高聚合性能。 尽管与先前的分布式文件系统…

2023 我的编程之旅——路人贾‘ω‘

哈喽&#xff01;大家好&#xff0c;我是路人贾&#x1f601;~今天不读论文也不讲算法&#xff0c;来聊点有意思的&#xff01; 这是我第100篇博文&#xff0c;我翻了几遍草稿箱的库存&#xff0c;正纠结选哪篇时&#xff0c;一抬头看见了这个活动&#xff0c;眼前瞬间一亮——…

高防服务器、高防 IP 和高防 CDN 之间有什么区别?

网络运营人员最头痛的是什么&#xff1f; 网络攻击无疑名列前茅。一旦企业遭受网络攻击&#xff0c;所面临的损失可能是无法估量的。那么&#xff0c;如何有效地抵御网络攻击呢&#xff1f; 高防 IP、高防 CDN 和高防服务器是当前主流的防御手段。那何为“高防”呢&#xff1…

【深度学习每日小知识】Overfitting 过拟合

过拟合是机器学习&#xff08;ML&#xff09;中的常见问题&#xff0c;是指模型过于复杂&#xff0c;泛化能力较差的场景。当模型在有限数量的数据上进行训练&#xff0c;并且学习了特定于该特定数据集的模式&#xff0c;而不是适用于新的、看不见的数据的一般模式时&#xff0…