QT(8.31)加载资源文件,信号与槽机制

news2024/11/19 10:38:56

作业:

实现登录界面,设置账号为admin,密码为123456,登陆成功则退出当前界面,切换到其他界面,密码错误或者账号不匹配则清空账号密码输入框中的内容,并输出登录失败,点击取消则退出当前登录界面

登录界面的头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QLineEdit>//行编辑器

#include<QIcon>//图标

#include<QLabel>//标签

#include<QPushButton>//按钮

#include<QIcon>//图标

#include<QDebug>//调试函数

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    QLabel *lab1;
    QLabel *lab2 ;
    QLabel *lab3 ;
    QLineEdit *dit1;
    QLineEdit *dit2 ;
    QPushButton *btn1;
    QPushButton *btn2;

public slots:
   void btn1_slot();   //自定义一个按钮1的槽函数

signals:
   void jump();    //定义跳转函数

};
#endif // WIDGET_H

登录界面的实现函数:

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setFixedSize(500,600);//设置窗口固定大小尺寸
    this->setWindowTitle("来也匆匆");//设置窗口标题
    this->setWindowIcon(QIcon(":/photo/ckbq.jpg"));//设置窗口图标
    this->setStyleSheet("background-color:purple");//设置窗口颜色
    lab1 = new QLabel(this);//创建一个标签,设置父组件为当前窗口组件
    lab1 -> resize(500,200);//设置标签大小
    lab1 -> setPixmap(QPixmap(":/photo/bj.jpg"));//标签中添加图片内容
    lab1 -> setScaledContents(true);//设置标签内容自适应
    lab2 = new QLabel(this);//创建标签,设置父组件为当前窗口组件
    lab2 -> resize(40,40);//设置标签大小
    lab2 -> move(120,300);//设置标签位置
    lab2 -> setPixmap(QPixmap(":/photo/userName.jpg"));
    lab2 -> setScaledContents(true);//设置内容自适应
    lab3 = new QLabel(this);//创建标签,设置父组件为当前窗口组件
    lab3 -> resize(40,40);//设置标签大小
    lab3 -> move(lab2->x(),lab2->y()+100);//设置标签位置
    lab3 -> setPixmap(QPixmap(":/photo/passwd.jpg"));
    lab3 -> setScaledContents(true);//设置标签内容自适应
    dit1 = new QLineEdit(this);//创建一个行编辑器,指定父组件
    dit1->setPlaceholderText("QQ/手机/邮箱");//设置占位文本
    dit1->move(lab2->x()+70,lab2->y());//设置行编辑器位置
    dit1->resize(250,40);//设置行编辑器大小
    dit1->setStyleSheet("background-color:white");//设置背景颜色
    dit2 = new QLineEdit(this);//创建一个行编辑器,父组件为当前窗口组件
    dit2->setPlaceholderText("密码");//设置占位文本
    dit2->move(lab3->x()+70,lab3->y());
    dit2->resize(250,40);//设置行编辑器大小
    dit2->setStyleSheet("background-color:white");//设置背景颜色
    dit2->setEchoMode(QLineEdit::Password);//设置输入为密文模式
    btn1 = new QPushButton("登录",this);//创建一个按钮,设置按钮文本为登录
    btn2 = new QPushButton("取消",this);//创建一个按钮,设置按钮文本为取消
    btn1->resize(80,40);//设置按钮大小
    btn2->resize(80,40);//设置按钮大小
    btn1->move(300,500);//设置按钮位置
    btn2->move(btn1->x()+100,btn1->y());//设置按钮位置
    btn1->setIcon(QIcon(":/photo/login.png"));//设置按钮图标
    btn2->setIcon(QIcon(":/photo/cancel.png"));//设置按钮图标
    connect(this->btn1,&QPushButton::clicked,this,&Widget::btn1_slot);
    connect(this->btn2,SIGNAL(clicked()),this,SLOT(close()));

}
void Widget::btn1_slot()
{
    QString userName = dit1->text();
    QString password = dit2->text();
    if(userName=="admin"&&password=="123456")
    {
        qDebug() << "登陆成功";
        emit jump();//发送跳转信号
        this->close();//关闭界面
    }
    else
    {
        qDebug() << "登录失败";
        dit1->clear();//清空行编辑器dit1中的内容
        dit2->clear();//清空行编辑器dit2中的内容
    }
}
Widget::~Widget()
{
}

跳转界面的头文件:

#ifndef SECOND_H
#define SECOND_H

#include <QWidget>

namespace Ui {
class Second;
}

class Second : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Second *ui;

public slots:
    void jump_slots();//定义一个接收跳转信号的槽
};

#endif // SECOND_H

跳转界面的实现函数

#include "second.h"
#include "ui_second.h"

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

Second::~Second()
{
    delete ui;
}
void Second::jump_slots()
{
    this->show();  //显示Second中的组件
}

主函数:

#include "widget.h"
#include "second.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;//实例化Widget类对象,取名w
    w.show();//调用w中的show函数,显示w中的所有组件
    Second s;//实例化Second类对象,取名s
    QObject::connect(&w,&Widget::jump,&s,&Second::jump_slots);
    //将w中的jump信号函数连接到s中的jump_slots槽函数中
    return a.exec();//阻塞等待
}

运行结果:

当账号密码输入错误时:

当账号密码输入正确(账号为admin,密码为123456)时:

出现的Form界面为切换界面

信号与槽机制实例代码:

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include<QPushButton>

#include<QDebug>

#include<QTextToSpeech>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT   //信号与槽的元对象
signals:
    void my_signal();    //声明一个自定义信号函数,发给别人
public slots:
    void my_slots();   //声明一个自定义槽函数,接收别人发来的
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_btn1_clicked();

    void on_btn6_clicked();

private:
    Ui::Widget *ui;
    //自定义一个按钮
    QPushButton *btn3;
    //定义一个播报员指针
    QTextToSpeech *speecher;
};
#endif // WIDGET_H

实现函数:

#include "widget.h"
#include "ui_widget.h"

void Widget::my_slots()
{
    static int num=0;
    if(num%2==0)
    {
        ui->btn1->setEnabled(false);//设置不可用状态
    }
    else
        ui->btn1->setEnabled(true);//设置可用状态
    num++;
}

void fun()
{
    //qDebug() << "我是路过的";
}
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //给播报员实例化空间
    speecher = new QTextToSpeech(this);

    //给btn3实例化空间
    this->btn3=new QPushButton("按钮3",this);
    this->btn3->move(ui->btn1->x(),ui->btn1->y()+50);
    this->btn3->resize(ui->btn1->size());
    //使用qt4版本的连接,将按钮3发射的pressed信号与按钮1的槽进行连接
    connect(btn3,SIGNAL(pressed()),ui->btn1,SLOT(hide()));//按下按钮3关闭按钮1
    //参数1:信号的发射者,按钮3的指针
    //参数2:要发射的信号,是在按钮所在类中拥有的信号函数,需要使用SIGNAL宏函数进行转换
    //参数3:信号的接受者,ui界面上的按钮1
    //参数4:处理信号的槽函数,是信号接受者所在类中拥有的槽函数
    //注意:该连接方式是不友好的链接,原因:即使宏函数中写错,编译器不报错,但没有现象

    //使用qt5版本的链接,将ui上面的btn4按钮发射的clicked信号,与当前界面的自定义的槽函数连接

    connect(ui->btn4,&QPushButton::clicked,this,&Widget::my_slots);
    //友好的链接

    //将ui界面上的按钮5,发送clicked信号,信号连接外部函数或lambda表达式
    connect(ui->btn5,&QPushButton::clicked,fun);

    //将ui界面上的按钮5发射的clicked信号连接到lambda表达式中
    connect(ui->btn5,&QPushButton::clicked,[&](){

        //语音播报内容
        speecher->say(ui->btn1->text());
    });
    //将当前界面的my_signal信号连接到自定义的槽函数(当前为lambda表达式)中
    connect(this,&Widget::my_signal,[&](){
        speecher->say("成功断开按钮3的链接");
    });

}

Widget::~Widget()
{
    delete ui;
}
//该函数就是按钮2的click信号对应的槽函数
void Widget::on_btn1_clicked()
{
    static int num=0;
    if(num==20)
    {
        ui->btn1->close();
    }
    if(num%3==0)
    {
        ui->btn1->setStyleSheet("background-color:red;");//按钮变成红色
    }
    else if(num%3==1)
    {
        ui->btn1->setStyleSheet("background-color:green;");//按钮变成绿色
    }
    else
    {
        ui->btn1->setStyleSheet("background-color:yellow;");//按钮变成黄色
    }
    num++;
}

void Widget::on_btn6_clicked()
{
    disconnect(btn3,SIGNAL(pressed()),ui->btn1,SLOT(hide()));//断开btn3的链接
    //发射自定义的信号(不是在按钮6中的信号,是在Widget中的信号)
    emit my_signal();

}

主函数:

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

xmind:

面试题:

1.多态,虚函数,纯虚函数

多态是类的三大属性之一,分为静态多态和动态多态,静态多态是函数重载,动态多态又称动态绑定,在运行时去确定对象的类型和正确选择需要调用的函数,一般用于解决基类指针或引用派生类对象调用类中的重写的函数时出现的问题。多态意为一种形式多种状态,是父类指针或者引用,指向或初始化子类的对象,调用子类对父类重写的函数,进而展开子类的功能。

虚函数是函数前加上virtual,虚函数满足继承,父类中该函数时虚函数,继承到子类中,依然是虚函数,如果子类再被继承,“孙类还是虚函数”。

当类中有虚函数或者继承了虚函数时,类中自动添加一个虚指针,虚指针指向一个虚函数列表,列表中寻访指向虚函数的指针,实际上是一个函数指针数组。虚指针是一个指向函数指针数组的指针。

纯虚函数是当父类中虚函数被子类用来重写,但没有真正意义的时候,把父类中的虚函数写成纯虚函数,有纯虚函数的类是一个抽象类,只能被继承,无法实例化一个具体的对象。每个抽象类中至少有一个纯虚函数。当子类继承了父类的两个纯虚函数但只重写了一个纯虚函数是,就还是一个抽象类,无法实例化一个对象。

2.引用作为函数参数有哪些特点:

1.引用必须在函数定义时声明,且不能为NULL,必须引用一块已经存在的内存空间。

2通过引用传参可以避免复制大量数据,提高程序的执行效率。

3.通过引用传递参数,可以在函数内部对实参进行修改,从而改变原始值,不用返回值。

4.引用参数可以让函数接收不同类型的参数。

5.引用和目标占用同一块空间,在作为参数传递时,不会开辟新的空间,没有值传递和地址传递的区别

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

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

相关文章

AIGC爆火,拓世法宝平台上线,打造属于你的专属数字人!

在数字科技的风潮下&#xff0c;短视频已经成为人们日常生活中不可或缺的一部分。中国互联网络信息中心于8月28日发布的第52次《中国互联网络发展状况统计报告》报告显示&#xff0c;截至2023年6月&#xff0c;中国短视频用户已达10.26亿人。在这里面&#xff0c;80后、90后和0…

视觉SLAM与激光SLAM简单对比分析

总述 本文旨在梳理目前较为前沿的SLAM技术&#xff0c;包括激光和视觉&#xff0c;主要从精度和实时性两个方面对算法进系评价。 对于激光SLAM了解不深&#xff0c;后期需要补充相关算法的核心思想与算法框架。有问题请大佬们随时留言&#xff0c;我再改正。 0.1 视觉SLAM算…

vue使用qrcodejs2生成二维码

目录 概要 构建展示的vue组件qrcode.vue 组件的使用 概要 项目中用到需要展示二维码的样式&#xff0c;想到了qrcode 例如&#xff1a; 前提&#xff1a;安装包 npm install qrcodejs2 --save 构建展示的vue组件qrcode.vue <template><div style"width: …

使用spring自带的发布订阅来实现发布订阅

背景 公司的项目以前代码里面有存在使用spring自带发布订阅的代码&#xff0c;因此稍微学习一下如何使用&#xff0c;并了解一下这种实现方式的优缺点。 优点 实现方便&#xff0c;代码方面基本只需要定义消息体和消费者&#xff0c;适用于小型应用程序。不依赖外部中间件&a…

学习高级数据结构:探索平衡树与图的高级算法

文章目录 1. 平衡树&#xff1a;维护数据的平衡与高效性1.1 AVL 树&#xff1a;严格的平衡1.2 红黑树&#xff1a;近似平衡 2. 图的高级算法&#xff1a;建模复杂关系与优化2.1 最小生成树&#xff1a;寻找最优连接方式2.2 拓扑排序&#xff1a;解决依赖关系 拓展思考 &#x1…

el-select下拉多选框 el-select 设置默认值不可删除功能

Element3.0vue3.0 el-select下拉多选框 el-select 设置默认值不可删除功能 Element-UI是一款广泛使用的Vue.js组件库&#xff0c;其中El-Select下拉多选框组件在实际项目开发中经常被使用。然而&#xff0c;在Element 3.0版本中&#xff0c;El-Select下拉多选框默认值可被删除&…

降本56%!纵腾集团搭载OceanBase Cloud开启降本增效新篇章

近日&#xff0c;跨境电商物流领跑企业福建纵腾网络有限公司&#xff08;以下简称“纵腾集团”&#xff09;正式商用原生分布式数据库 OceanBase&#xff0c;为其下专业物流服务“云途物流”提供云数据库支撑服务。目前&#xff0c;已有两大关键业务系统全部接入 OceanBase Clo…

基于JAVAEE技术的ssm校园车辆管理系统源码和论文

基于JAVAEE技术的ssm校园车辆管理系统源码和论文105 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1.选题背景和意义 背景&#xff1a; 随着第二次工业革命后&#xff0c;内燃机的发明与完善&#xff0c;解…

Charles信任证书后依然无法抓包的解决方案

前提 1、Charles安装证书 2、Charles设置SSL代理 3、查看Android安装Charles证书的方法 4、查看Android安装的Charles证书 问题 Charles拦截时&#xff0c;报“SSL handshake with client failed: An unknown issue occurred processing the certificate (certificate_unknow…

Ubuntu20.04安装ROS

Ubuntu20.04安装ROS Excerpt ubuntu安装方式有两种&#xff0c;一种是安装ubuntu系统&#xff0c;另一种是在windows下安装虚拟机&#xff0c;在虚拟机里安装ubuntu。下面为双系统安装ubuntu&#xff08;用虚拟机装ubuntu会很卡&#xff0c;bug很多&#xff0c;除非电脑配置极好…

UI按钮设计原则,让你的产品一次打动用户!

UI按钮是常见的界面组件,广泛应用于表单、对话框以及工具栏等场景。与链接不同,按钮用于让用户执行特定操作,如提交、删除等;而链接则将用户引导到新的页面。优秀的按钮设计能极大地提高用户的操作效率和转化率。本文将全面介绍按钮设计的相关指南,并通过实例解析如何设计出能最…

Android之布局转圆角

Android之布局转圆角 文章目录 Android之布局转圆角说明一、效果图二、实现步骤1.自定义RoundRelativeLayout2.使用 总结 说明 很多需求比较无语&#xff0c;需要某个布局转圆角&#xff0c;像个显眼包一样&#xff0c;所以为了满足显眼包&#xff0c;必须整呐提示&#xff1a…

01_lwip_raw_udp_test

1.打开UDP的调试功能 &#xff08;1&#xff09;设置宏定义 &#xff08;2&#xff09;打开UDP的调试功能 &#xff08;3&#xff09;修改内容&#xff0c;串口助手打印的日志信息自动换行 2.电脑端连接 UDP发送一帧数据 3.电路板上发送一帧数据

k8s etcd 简介

Etcd是CoreOS基于Raft协议开发的分布式key-value存储&#xff0c;可用于服务发现、共享配置以及一致性保障&#xff08;如数据库选主、分布式锁等&#xff09;。 如&#xff0c;Etcd也可以作为微服务的注册中心&#xff0c;比如SpringCloud也基于ETCD实现了注册中心功能&#…

如何利用Python代码优雅的进行文件下载

如何利用Python代码优雅的进行文件下载 一、什么是wget&#xff1f;二、使用wget.exe客户端进行文件下载三、使用Python脚本进行文件下载 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、什么是wget&#xff1f;…

【LeetCode算法系列题解】第6~10题

CONTENTS LeetCode 6. N 字形变换&#xff08;中等&#xff09;LeetCode 7. 整数反转&#xff08;中等&#xff09;LeetCode 8. 字符串转换整数-atoi&#xff08;中等&#xff09;LeetCode 9. 回文数&#xff08;简单&#xff09;LeetCode 10. 正则表达式匹配&#xff08;困难&…

hadoop的hadoop.tmp.dir安装时一定要更改

hadoop的hadoop.tmp.dir安装时一定要更改 hadoop.tmp.dir 属性确保了 HDFS 元数据的存储位置&#xff0c;其中包含了一些关键的文件&#xff0c;如&#xff1a; fsimage 文件&#xff1a;这是 HDFS 的文件系统镜像&#xff0c;记录了整个文件系统命名空间的状态。它包含所有文…

飞腾PSPA可信启动--4 可信固件环境搭建和打包

今天继续第四章&#xff0c;飞腾可信固件环境搭建和打包介绍。 此章节录制了讲解视频&#xff0c;可以在B站进行观看&#xff1a; Gmssl-master文件&#xff0c;可以关注公众号“乌拉大喵喵”后回复“Gmssl”获取。&#xff08;区分大小写&#xff09;

方案小知识

云平台 云平台也称云计算平台. 云计算, 顾名思义, 就是将计算在云上运行. 那么在这里面的3个概念 云: 通俗的理解就是远程计算机, 并且是一组 一堆, 这些远程计算机协同工作构建出一个平台&#xff0c;对用户提供服务计算&#xff1a;这是一个概念很大的名词&#xff0c;小了…

Nacos服务发起注册找不到nacos

错误概述 service启动报错&#xff0c;显示服务发起注册的时候找不到nacos failed to req API:/nacos/v1/ns/instance after all servers([localhost:8845]) tried: ErrCode:400, ErrMsg:<html><body><h1>Whitelabel Error Page</h1><p>This …