QT(9.1)对话框与事件处理

作业:

1.

完善登录框

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

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

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

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

pro文件:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    second.cpp \
    widget.cpp

HEADERS += \
    second.h \
    widget.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    photo.qrc

FORMS += \
    second.ui

登录界面头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QLineEdit>//行编辑器

#include<QIcon>//图标

#include<QLabel>//标签

#include<QPushButton>//按钮

#include<QIcon>//图标

#include<QDebug>//调试函数

#include<QMessageBox>//消息对话框

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的槽函数

   void btn2_slot(); // 自定义一个按钮2的槽函数
signals:
   void jump();    //定义跳转函数

};
#endif // WIDGET_H

跳转界面头文件:

#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 "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(btn2_slot()));

}
void Widget::btn1_slot()
{
    QString userName = dit1->text();
    QString password = dit2->text();
    if(userName=="admin"&&password=="123456")
    {
        int res = QMessageBox::information(this,
                                           "提示",
                                           "登陆成功",
                                           QMessageBox::Ok|QMessageBox::Cancel,
                                           QMessageBox::Ok);

        if(res == QMessageBox::Ok)
        {
            emit jump();//发送跳转信号
            this->close();//关闭界面
        }
    }
    else
    {
        int res = QMessageBox::critical(this,
                                        "登录失败",
                                        "账号密码不匹配,是否重新登录",
                                        QMessageBox::Yes|QMessageBox::Cancel,
                                        QMessageBox::Yes);
        if(res == QMessageBox::Yes)
        {
            dit2->clear();//清空行编辑器dit2中的内容
        }
    }
}
void Widget::btn2_slot()
{
    QMessageBox box(QMessageBox::Question,
                     "问题",
                     "是否要取消登录",
                     QMessageBox::Yes|QMessageBox::No,
                     this);
    int ret = box.exec();
    if(ret == QMessageBox::Yes)
    {
        this->close();
    }
}
Widget::~Widget()
{
}

跳转界面实现函数:

#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();//阻塞等待
}

2.实现文件对话框的保存功能槽函数:

//保存文件按钮的对应槽函数
void Widget::on_savebtn_clicked()
{
    //调用QFileDialog的静态成员函数getSaveFileName来获取选中文件的路径
    QString filename = QFileDialog::getSaveFileName(this,
                                                    "保存文件",
                                                    "./",
                                                    "Image File(*.png *.jpg *.bmp);;Text File(*.txt);;All(*.*)"
                                                    );
    if(filename.isNull())
    {
        QMessageBox::information(this,"提示","您取消了保存文件");
        return;
    }
    QFile file(filename);//1.实例化一个文件对象
    if(!file.open(QFile::WriteOnly))//以只写操作打开文件
    {
        return;
    }
    QString buf=ui->textEdit->toPlainText();//2.获取文本编辑器中的纯文本内容
    file.write(buf.toLocal8Bit());//3.将文本内容转换成c风格字符串并写入文件中
    file.close();//4.关闭文件
}

3.实现按键盘wsad键实现小球上下左右移动的键盘按下处理函数:

//键盘按下事件处理函数的定义
void Widget::keyPressEvent(QKeyEvent *event)
{
    qDebug() << "键盘被按下了" << event->text()<<"键值为:" << event->key();
    switch(event->key())
    {
    case'W':
    {
        if(ui->label->y()<=0-ui->label->height())
        {
            ui->label->move(ui->label->x(),this->height());
        }
        ui->label->move(ui->label->x(),ui->label->y()-10);
        break;
    }
    case'S':
    {
        if(ui->label->y()>=this->height())
        {
            ui->label->move(ui->label->x(),0-ui->label->height());
       }
        ui->label->move(ui->label->x(),ui->label->y()+10);
        break;
    }
    case'A':
    {
        if(ui->label->x()<=0-ui->label->width())
        {
            ui->label->move(this->width(),ui->label->y());
        }
        ui->label->move(ui->label->x()-10,ui->label->y());
        break;
    }
    case'D':
    {
        if(ui->label->x()>=this->width())
        {
            ui->label->move(0-ui->label->width(),ui->label->y());
        }
        ui->label->move(ui->label->x()+10,ui->label->y());
        break;
    }
    }
}

Xmind:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

B081-Lucene+ElasticSearch

目录 认识全文检索概念lucene原理全文检索的特点常见的全文检索方案 Lucene创建索引导包分析图代码 搜索索引分析图代码 ElasticSearch认识ElasticSearchES与Kibana的安装及使用说明ES相关概念理解和简单增删改查ES查询DSL查询DSL过滤 分词器IK分词器安装测试分词器 文档映射(字…

大数据组件-Flume集群环境搭建

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

sentinel熔断报java.lang.reflect.UndeclaredThrowableException

背景&#xff1a;内部要进行应用jdk&springboot升级&#xff0c;因此也需要将Spring Cloud Hystrix 替换成alibaba sentinel。 依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</a…

Android安卓实战项目(13)---记账APP详细记录每天的收入和支出并且分类统计【生活助手类APP】强烈推荐自己也在用!!!(源码在文末)

Android安卓实战项目&#xff08;13&#xff09;—记账APP详细记录每天的收入和支出并且分类统计【生活助手类APP】强烈推荐自己也在用&#xff01;&#xff01;&#xff01;&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09; 一.项目运行介绍 B站…

机器学习概念

目录 一、人工智能、机器学习、深度学习的关系 二、什么是深度学习&#xff1f; 2.1 深度学习常用算法 一、人工智能、机器学习、深度学习的关系 人工智能、机器学习和深度学习的关系如下所示。 二、什么是深度学习&#xff1f; 深度学习( DL, Deep Learning) 是机器学习 …

机器学习——聚类算法一

机器学习——聚类算法一 文章目录 前言一、基于numpy实现聚类二、K-Means聚类2.1. 原理2.2. 代码实现2.3. 局限性 三、层次聚类3.1. 原理3.2. 代码实现 四、DBSCAN算法4.1. 原理4.2. 代码实现 五、区别与相同点1. 区别&#xff1a;2. 相同点&#xff1a; 总结 前言 在机器学习…

微机原理 || 第3次测试:第八章-常用接口芯片82558253(测试题+手写解析)

&#xff08;一&#xff09;知识点总结 一直没有学明白8253和8255芯片&#xff0c;觉得后面难&#xff0c;其实看懂后&#xff0c;就是照着表格去对应填写&#xff0c; 知道地址怎么回事就没问题哒~ 相信你&#x1f618; 一、8255芯片&#xff08;不是偷懒&#xff0c;真的就…

百亿级访问量,如何做缓存架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、网易、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a;&#xff1a; 分布式缓存系统&#xff0c;如何架构&#xff1f;百亿级访…

Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)

Android安卓实战项目&#xff08;12&#xff09;—关于身体分析&#xff0c;BMI计算&#xff0c;喝水提醒&#xff0c;食物卡路里计算APP【支持中英文切换】生活助手类APP&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09; 一.项目运行介绍 B站演示…

题目有点太简单了,不知道怎么选了

有个公司给了下面一个题目&#xff0c;看了下太简单了&#xff0c;都怕选错了。 后来拿着程序跑了下&#xff0c;就是这个意思嘛。 结论 程序跑出来的结果就是对输入的列表进行倒序排列。 public void testGetPut() throws Exception {List<Integer> numbers List.of(…

安防监控/磁盘阵列存储/视频汇聚平台EasyCVR调用rtsp地址返回的IP不正确是什么原因?

安防监控/云存储/磁盘阵列存储/视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RT…

【SQL应知应会】索引 • Oracle版:B-树索引;位图索引;函数索引;单列与复合索引;分区索引

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文免费学习&#xff0c;自发文起3天后&#xff0c;会收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle …

Vue+Element-ui实现表格本地导入

表格文件存储在前端 如图&#xff0c;表格文件template.xlsx存储在public下的static文件夹下 注意这里的路径容易报错 a链接下载文件失败的问题(未发现文件&#xff09; a.href ‘./static/template.xlsx’ 写的时候不能带public&#xff0c;直接这么写就可以 DownloadTemp…

Linux进程概念及其状态

文章目录 &#x1f347;1. 什么是进程&#x1f348;1.1 概念&#x1f348;1.2 理解进程 &#x1f34b;2. Linux的PCB&#x1f34e;3. 查看进程 & 杀死进程&#x1f352;4. 系统调用获取进程标识符&#x1f353;4.1 进程PID&#x1f353;4.2 父进程PPID &#x1f346;5. 系统…

uniapp 微信小程序添加隐私保护指引

隐私弹窗&#xff1a; <uni-popup ref"popup"><view class"popupWrap"><view class"popupTxt">在你使用【最美万年历】之前&#xff0c;请仔细阅读<text class"blueColor" click"handleOpenPrivacyContract…

Linux学习之lvm删除

umount /mnt/logicvolumntest卸载挂载。 lvremove /dev/vgname/my_lv可以删除逻辑卷&#xff0c;其中vgname是指定逻辑卷所在的卷组名称&#xff0c;my_lv是逻辑卷的名称。 注意&#xff1a;使用lvremove命令会永久删除逻辑卷和其中的数据&#xff0c;因此请在使用之前进行适当…

解决springboot项目中的groupId、package或路径的混淆问题

对于像我一样喜欢跳跃着学习的聪明人来说&#xff0c;肯定要学springboot&#xff0c;什么sevlet、maven、java基础&#xff0c;都太老土了&#xff0c;用不到就不学。所以古代的聪明人有句话叫“书到用时方恨少”&#xff0c;测试开源项目时&#xff0c;编译总是报错&#xff…

【FreeRTOS】互斥量的使用与逐步实现

在FreeRTOS中&#xff0c;互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式&#xff0c;确保在任意时刻只有一个任务可以获取互斥量并访问共享资源&#xff0c;其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量…

RNN 单元:分析 GRU 方程与 LSTM,以及何时选择 RNN 而不是变压器

一、说明 深度学习往往感觉像是在雪山上找到自己的道路。拥有坚实的原则会让你对做出决定更有信心。我们都去过那里 在上一篇文章中&#xff0c;我们彻底介绍并检查了 LSTM 单元的各个方面。有人可能会争辩说&#xff0c;RNN方法已经过时了&#xff0c;研究它们是没有意义的。的…

Python Opencv实践 - 轮廓检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/map.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#Canny边缘检测 edges cv.Canny(img, 127, 255, 0) plt.imshow(edges, cmapplt.cm.gray)#查找轮廓 #c…