2023/9/18 -- C++/QT

作业

完善登录框

点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。

如果账号和密码匹配,则弹出信息对话框,给出提示信息为“登录成功”,给出一个按钮ok,点击ok后,关闭整个登录界面,跳转到其他界面

点击取消按钮后,弹出问题对话框,询问是否确定要退出登录,给出两个按钮,yes|no,点击yes,则直接关闭整个登录界面,如果点击no则进行进行登录

要求:消息对话框,对象版和静态成员函数版至少各实现一个

【免费】2023/9/18-C++/QT实现简易登录资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/weixin_54147737/88354416

一、信号与槽机制

1.1 简介

1> 信号与槽机制,是qt引以为傲的、能够立于编程界而不倒的核心机制

2> 作用:实现多个组件之间的互相通信,一个组件发信号,另一个组件接收信号后,做相应的响应

3> 原理类似于IO中的两个进程间通过信号通信,但是,这里的信号,是可以传递信息的

1.2 信号与槽

1> 信号:信号函数,定义在类体内signals权限下的特殊成员函数,该函数是不完整的函数,只有声明,没有定义,返回值为void,参数就是传递的信息

2> 槽:槽函数,定义在类体内slots权限下的成员函数,该函数是完整的函数,既有声明也有定义,返回值为void类型,参数就是接收信号的信息

3> 槽函数可以被当作普通函数一样调用,但是普通函数不能当作槽函数一样连接信号

4> 信号函数和槽函数,不是标准的C++代码,通过moc.exe工具将其自动转化为标准的C++代码

5> 信号函数和槽函数可以是组件自带的,也可以由用户自定义,系统提供的每个组件都会自带信号与槽

6> 包含信号与槽的类体定义

class Widget : public QWidget
{Q_OBJECT            //有关信号与槽的元对象signals:                    //该权限下定义属于自己的信号void my_signal();           //自定义一个无参无返回值的信号函数private slots:void my_slot();                //自定义无参无返回值的槽函数public:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

1.3 信号与槽的连接

1> 基于ui界面的,手动选中信号与槽的连接,该连接只适用于系统提供的信号与槽的连接,连接函数也是由系统实现

2> 也是基于ui界面,在组件上右键转到槽,手动实现槽函数的内容,该方法只能更改槽函数逻辑,信号、连接都是由系统实现

3> qt4版本手动连接信号与槽,该连接是不友好的连接,因为两个宏的原因,它会将所有传递的数据都改成字符串类型

[static] QMetaObject::Connection               //返回值:是建立的信号与槽的连接,是一个静态成员函数QObject::connect(                          //函数名const QObject *sender,                 //信号发射者,是组件的指针const char *signal,                    //要发射的信号函数,函数是函数指针,要的是字符串类型,所以需要使用SIGNAL()宏进行转换后使用const QObject *receiver,                 //信号接收者,是组件的指针const char *method)                       //接收信号后,接收者要处理的槽函数,函数是函数指针,要的是字符串类型,所以需要使用SLOT()宏进行转换后使用
举个例子:QLabel *label = new QLabel;QScrollBar *scrollBar = new QScrollBar;QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

4> 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);

5> 信号连接功能函数

[static] QMetaObject::Connection          //返回值:是建立的信号与槽的连接,是一个静态成员函数QObject::connect(               //函数名const QObject *sender,          //信号发射者,是组件的指针PointerToMemberFunction signal,    //信号函数的指针,要指定是哪个类中的哪个成员函数Functor functor)            //功能函数:全局函数作为功能函数、仿函数作为功能函数、lambda表达式作为功能函数
举个例子1,全局函数作为功能函数:void someFunction();QPushButton *button = new QPushButton;QObject::connect(button, &QPushButton::clicked, someFunction);举个例子2:lambda作为功能函数QByteArray page = ...;QTcpSocket *socket = new QTcpSocket;socket->connectToHost("qt-project.org", 80);QObject::connect(socket, &QTcpSocket::connected, [=] () {socket->write("GET " + page + "\r\n");});

6> 信号与槽的断开

只需将之前的连接函数的connect改成disconnect即可,参数不变

1.4 信号的定义与发射

1、在类体的signals权限下,定义属于自己的信号

2、信号函数只有声明,没有定义,返回值为void,可用有参数

3、在程序所需处,使用关键字emit发射自定义的信号,格式:emit 信号名(实参);

4、信号函数可以连接到槽函数中,也可以连接另一个信号函数,表明发射第一个信号时,第二个信号跟着发射

1.5 信号与槽的总结

1> 一个信号可以连接多个槽函数

2> 一个槽函数可以连接多个信号函数

3> 一个信号函数可以连接到槽函数中,也可以连接另一个信号

4> 信号函数和槽函数参数个数

    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

1.6 使用信号与槽实现简单的页面跳转

1> 准备两个界面

2> 在第一个界面中,定义跳转的信号函数,第二个界面定义槽函数

3> 可以在主程序中实例化两个界面,第一个界面调用show函数,第二个不调用,并且在主调函数中将第一个界面的信号与第二个界面的槽函数连接

1) 头文件

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include"second.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();signals:void jump();           //自定义跳转信号函数private slots:void on_loginBtn_clicked();private:Ui::Widget *ui;Second *s1;             //定义另一个界面的指针
};
#endif // WIDGET_H

second.h

#ifndef SECOND_H
#define SECOND_H#include <QWidget>namespace Ui {
class Second;
}class Second : public QWidget
{Q_OBJECTpublic slots:void jump_slot();         //接收跳转信号的槽函数public:explicit Second(QWidget *parent = nullptr);~Second();private:Ui::Second *ui;
};#endif // SECOND_H

2) 源文件

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);s1 = new Second;            //给另一个界面实例化空间//将当前界面的信号,与s1界面的槽函数进行连接connect(this,&Widget::jump, s1, &Second::jump_slot);
}Widget::~Widget()
{delete ui;
}void Widget::on_loginBtn_clicked()
{emit jump();this->hide();        //将当前界面隐藏
}

second.cpp

#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_slot()
{this->show();            //将自己界面进行展示
}

3) 主程序

#include "widget.h"
#include"second.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//Second s;           //定义第二个界面//连接w的信号与s的槽//QObject::connect(&w, &Widget::jump, &s, &Second::jump_slot);return a.exec();
}

二、对话框

2.1 消息对话框(QMessageBox)

1> 该类提供的消息对话框,用于提高用户的交互性,可以提供问题对话框、信息对话框、警告对话框、错误对话框。。。

2> 实现该对话框的方式有两种:基于属性版本、静态成员函数版本

3> 基于属性版本实现消息对话框:公共该类实例化对象,调用exec函数进入执行态,该函数返回值时用户点击的按钮

QMessageBox::QMessageBox(                             //构造函数函数名QMessageBox::Icon icon,                             //图标const QString &title,                                 //对话框标题const QString &text,                                    //对话框提示文本内容QMessageBox::StandardButtons buttons = NoButton,         //对话框提供的按钮,如果有多个按钮,则使用位或隔开QWidget *parent = nullptr)                                //父组件参数1介绍,对话框提供的图标,该类中的枚举值ConstantValueDescription
QMessageBox::NoIcon0the message box does not have any icon.//不提供任何图标
QMessageBox::Question4an icon indicating that the message is asking a question.//提供一个问号图标
QMessageBox::Information1an icon indicating that the message is nothing out of the ordinary.//提供一个i符号图标
QMessageBox::Warning2an icon indicating that the message is a warning, but can be dealt with.//提供一个感叹号图标
QMessageBox::Critical3an icon indicating that the message represents a critical problem.  //提供一个叉号图标参数4介绍,对话框上提供的标准按钮,时类中的枚举值,如果有多个按钮,中间有位或隔开 
ConstantValueDescription
QMessageBox::Ok0x00000400An "OK" button defined with the AcceptRole.  //提供一个ok按钮
QMessageBox::Open0x00002000An "Open" button defined with the AcceptRole. //提供一个open按钮
QMessageBox::Save0x00000800A "Save" button defined with the AcceptRole.  //提供一个保存按钮
QMessageBox::Cancel0x00400000A "Cancel" button defined with the RejectRole. //提供一个取消按钮
QMessageBox::Close0x00200000A "Close" button defined with the RejectRole.  //提供一个关闭按钮
QMessageBox::Discard0x00800000A "Discard" or "Don't Save" button, depending on the platform, defined with the DestructiveRole.//不保存
举个例子:QMessageBox msgBox;               //实例化对象msgBox.setText("The document has been modified.");msgBox.setInformativeText("Do you want to save your changes?");msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);msgBox.setDefaultButton(QMessageBox::Save);int ret = msgBox.exec();               //展示对话框//判断用户点击的结果switch (ret) {case QMessageBox::Save:// Save was clickedbreak;case QMessageBox::Discard:// Don't Save was clickedbreak;case QMessageBox::Cancel:// Cancel was clickedbreak;default:// should never be reachedbreak;}

4> 基于静态成员函数版本:无需实例化对象,但是只能设置有限的信息

[static] QMessageBox::StandardButton             //函数返回值类型,是用户点击的标准按钮,该函数是静态成员函数QMessageBox::warning(                //函数名QWidget *parent,                  //父组件const QString &title,            //对话框标题const QString &text,             //对话框文本内容QMessageBox::StandardButtons buttons = Ok,     //提供的标准按钮,多个按钮用位或隔开QMessageBox::StandardButton defaultButton = NoButton)    //默认选中的按钮举个例子:int ret = QMessageBox::warning(this, tr("My Application"),tr("The document has been modified.\n""Do you want to save your changes?"),QMessageBox::Save | QMessageBox::Discard| QMessageBox::Cancel,QMessageBox::Save);其余的静态成员函数QMessageBox::StandardButton 
critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton)
QMessageBox::StandardButton 
information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = Ok, QMessageBox::StandardButton defaultButton = NoButton)
QMessageBox::StandardButton 
question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = StandardButtons(Yes | No), QMessageBox::StandardButton defaultButton = NoButton)

5> 案例

1) 头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QMessageBox>            //消息对话框类
#include<QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_quesBtn_clicked();void on_warnBtn_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

2) 源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}//问题按钮对应的槽函数
void Widget::on_quesBtn_clicked()
{//1、调用构造函数实例化对象QMessageBox box(QMessageBox::Question,            //图标"问题",                           //对话框标题"晚上约不?",                       //对话框文本内容QMessageBox::Yes | QMessageBox::No,   //提供的按钮this);                                 //父组件box.setDetailedText("有上好的飞天茅台");         //提供详细文本内容box.setDefaultButton(QMessageBox::No);          //将no设置成默认按钮box.setButtonText(QMessageBox::Yes, "好的");box.setButtonText(QMessageBox::No, "没空");//2、调用exec函数运行对话框int ret = box.exec();//3、对结果进行判断if(ret == QMessageBox::Yes){qDebug()<<"木的问题,老地方见";}else if(ret == QMessageBox::No){qDebug()<<"下次一定";}
}//警告按钮对应的槽函数
void Widget::on_warnBtn_clicked()
{//直接调用静态成员函数完成对话框的实现int ret = QMessageBox::warning(this,                      //父组件"警告",                     //对话框标题"放学等着,别走",               //对话框文本内容QMessageBox::Yes|QMessageBox::No,   //对话题提供的按钮QMessageBox::No);                 //默认选中的按钮//对用户选中的按钮进行判断if(ret == QMessageBox::Yes){qDebug()<<"行,荤的还是素的,文的还是武的任你挑";}else if(ret == QMessageBox::No){qDebug()<<"你永远是我大哥";}
}

三、加载资源文件

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

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

相关文章

WebGL 视图矩阵、模型视图矩阵

目录 立方体由三角形构成 视点和视线 视点、观察目标点和上方向 视点&#xff1a; 观察目标点&#xff1a; 上方向&#xff1a; 在WebGL中&#xff0c;观察者的默认状态应该是这样的&#xff1a; 视图矩阵程序&#xff08;LookAtTriangles.js&#xff09; 实际上&…

仅做笔记用:Stable Diffusion 通过 ControlNet 扩展图片 / 扩图

发觉之前的 Outpainting 脚本效果仍旧不是很理想。这里又找了一下有没有效果更好的途径来扩图。于是就找到了通过 ControlNet 的方式来实现效果更好的扩图。这里临时记录一下在 Stable Diffusion 怎么使用 ControlNet 来扩展图片。 下载 control_v11p_sd15_inpaint_fp16.safet…

多线程详解(上)

文章目录 一、线程的概念1&#xff09;线程是什么2&#xff09;为甚要有线程&#xff08;1&#xff09;“并发编程”成为“刚需”&#xff08;2&#xff09;在并发编程中, 线程比进程更轻量. 3&#xff09;线程和进程的区别 二、Thread的使用1&#xff09;线程的创建继承Thread…

自定义类型:结构体

自定义类型&#xff1a;结构体 一&#xff1a;引入二&#xff1a;结构体类型的声明1&#xff1a;正常声明2&#xff1a;特殊声明 三&#xff1a;结构体变量的创建和初始化1:结构体变量的创建2&#xff1a;结构体变量的初始化 三&#xff1a;结构体访问操作符四&#xff1a;结构…

【C语言】每日一题(半月斩)——day3

目录 一&#xff0c;选择题 1.已知函数的原型是&#xff1a; int fun(char b[10], int *a); 2、请问下列表达式哪些会被编译器禁止【多选】&#xff08; &#xff09; 3、以下程序的输出结果为&#xff08; &#xff09; 4、下面代码段的输出是&#xff08; &#xff09;…

大数据学习1.1-Centos8虚拟机安装

1.创建新的虚拟机 2.选择稍后安装OS 3.选择Linux的CentOS8 4.选择安装路径 5.分配20g存储空间 6.自定义硬件 7.分配2g内存 8.分配2核处理器 9.选择镜像位置 10.开启虚拟机安装 推荐密码设置为root

61、SpringBoot -----跨域资源的设置----局部设置和全局设置

★ 跨域资源共享的意义 ▲ 在前后端分离的开发架构中&#xff0c;前端应用和后端应用往往是彻底隔离的&#xff0c;二者不在同一个应用服务器内、甚至不再同一台物理节点上。 因此前端应用和后端应用就不在同一个域里。▲ 在这种架构下&#xff0c;前端应用可能采用前端框架&a…

序列化和反序列化:将数据变得更加通用化

序列化与反序列化简介 序列化和反序列化是计算机领域中常用的概念&#xff0c;用于将对象或数据结构转换为字节序列&#xff08;序列化&#xff09;和将字节序列转换回对象或数据结构&#xff08;反序列化&#xff09;。 序列化是指将对象或数据结构转换为字节序列的过程。通…

前端VUE---JS实现数据的模糊搜索

实现背景 因为后端实现人员列表返回&#xff0c;每次返回的数据量在100以内&#xff0c;要求前端自己进行模糊搜索 页面实现 因为是实时更新数据的&#xff0c;就不需要搜索和重置按钮了 代码 HTML <el-dialogtitle"团队人员详情":visible.sync"centerDi…

uni-app跳转到另一个app

第一步&#xff1a; 首先要知道 app的包名 获取方式如下 第二步&#xff1a; 在第一个 demo1 app 一个页面中需要一个按钮去跳转 方法如下 <template><view class"content"><button click"tz">跳转</button></view> </…

如何在微软Edge浏览器上一键观看高清视频?

编者按&#xff1a;视频是当下最流行的媒体形式之一。但由于视频压缩、网络不稳定等原因&#xff0c;我们常常可以看到互联网上的很多视频其画面质量并不理想&#xff0c;尤其是在浏览器端&#xff0c;这极大地影响了观看体验。不过&#xff0c;近期微软 Edge 浏览器推出了一项…

FPGA纯verilog实现8路视频拼接显示,提供工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、我已有的FPGA视频拼接叠加融合方案3、设计思路框架视频源选择OV5640摄像头配置及采集静态彩条视频拼接算法图像缓存视频输出 4、vivado工程详解5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他注意事项 6、上板调试验证并演示…

Jmeter接口测试简易步骤

使用Jmeter接口测试 1、首先右键添加一个线程组&#xff0c;然后我们重命名接口测试 2、在线程组上添加一个Http默认请求&#xff0c;并配置服务器的IP地址端口等信息 3、在线程组中添加一个HTTP请求&#xff0c;这里我们重命名“增加信用卡账户信息接口” 4、配置接口请求信息…

使用延迟队列解决分布式事务问题——以订单未支付过期,解锁库存为例

目录 一、前言 二、库存 三、订单 一、前言 上一篇使用springcloud-seata解决分布式事务问题-2PC模式我们说到了使用springcloud-seata解决分布式的缺点——不适用于高并发场景 因此我们使用延迟队列来解决分布式事务问题&#xff0c;即使用柔性事务-可靠消息-最终一致性方…

Kotlin simple convert ArrayList CopyOnWriteArrayList MutableList

Kotlin simple convert ArrayList CopyOnWriteArrayList MutableList Kotlin读写分离CopyOnWriteArrayList_zhangphil的博客-CSDN博客Java并发多线程环境中&#xff0c;造成死锁的最简单的场景是&#xff1a;多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2&#xff0c;而多…

Redis缓存实现及其常见问题解决方案

随着互联网技术的发展&#xff0c;数据处理的速度和效率成为了衡量一个系统性能的重要指标。在众多的数据处理技术中&#xff0c;缓存技术以其出色的性能优化效果&#xff0c;成为了不可或缺的一环。而在众多的缓存技术中&#xff0c;Redis 以其出色的性能和丰富的功能&#xf…

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴 在开发过程中&#xff0c;需要长按TextField输入框cut、copy设置为中文“复制、粘贴”&#xff0c;这里记录一下设置的代码。 一、pubspec.yaml设置flutter_localizations 在pubspec.yaml中设置flutter_l…

23下半年学习计划

大二上学期计划 现在已经是大二了&#xff0c;java只学了些皮毛&#xff0c;要学的知识还有很多&#xff0c;新的学期要找准方向&#xff0c;把要学的知识罗列&#xff0c;按部就班地完成计划&#xff0c;合理安排时间&#xff0c;按时完成学习任务。 学习node.js&#xff0c…

企业架构LNMP学习笔记48

数据结构类型操作&#xff1a; 数据结构&#xff1a;存储数据的方式 数据类型 算法&#xff1a;取数据的方式&#xff0c;代码就把数据进行组合&#xff0c;计算、存储、取出。 排序算法&#xff1a;冒泡排序、堆排序 二分。 key&#xff1a; key的命名规则不同于一般语言…

Android 12 源码分析 —— 应用层 六(StatusBar的UI创建和初始化)

Android 12 源码分析 —— 应用层 六&#xff08;StatusBar的UI创建和初始化) 在前面的文章中,我们分别介绍了Layout整体布局,以及StatusBar类的初始化.前者介绍了整体上面的布局,后者介绍了三大窗口的创建的入口处,以及需要做的准备工作.现在我们分别来细化三大窗口的UI创建和…