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

news2025/1/17 1:05:21

作业:

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:

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

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

相关文章

【kubernetes】k8s部署APISIX及在KubeSphere使用APISIX

Apache APISIX https://apisix.apache.org/ 功能比nginx-ingress更强 本文采用2.5.0版本 https://apisix.apache.org/zh/docs/apisix/2.15/getting-started/ 概述内容来源于官方&#xff0c;学习于马士兵云原生课程 概述 Apache APISIX 是什么&#xff1f; Apache APISIX 是 …

前端JS学习(一)

基础 JavaScript书写位置 1、行内 JavaScript   通常放在文档结尾的 < / b o d y > </body> </body> 上面   将 < s c r i p t > <script> <script>放在HTML文件的底部附近是因为浏览器会按照代码在文件中的顺序加载HTML。 2、内部J…

解决在写论文过程中遇到的插入到论文中的图片不清晰的问题(全网最详细最全解决方法)

目录 1 插入到word中的图片不清晰 2 将word转化为pdf以后图片不清晰 3 在利用latex写作过程中得到的pdf图片不清晰 4 将位图转换为矢量图 在读论文的过程中其实我们可以发现很多论文的插图在放大以后是模糊的&#xff0c;这是因为他们所插入的并不是矢量图。 矢量图&#x…

关于数学建模论文中“学习率”是什么东西?

问题背景 数学建模2022年无人机问题的时候遇见一个关于学习率的东西&#xff0c;不是很清楚的现在可以看看下面的内容了。 问题解决 学习率在机器学习和优化中是一个常见的概念&#xff0c;它决定了模型在每次更新时应该调整多少。较高的学习率可能会导致模型在寻找最优解时跳…

Questa Sim使用教程仿真-示例

Questa Sim0基础仿真教程 文章目录 一、 打开软件二、运行编译后的文件 一、 打开软件 1、新建工程 File -> New -> project 2、填写工程名称和工程位置然后点"ok" 3、编写或者添加文件&#xff0c;这里直接添加一个编写好的反相器的文件。 可关注公众号&a…

进程控制块(PCB)的存储方式

进程控制块&#xff08;PCB, Process Control Block&#xff09;是操作系统用于描述和控制进程的重要数据结构。它包含了与进程有关的所有必要信息。为了有效地组织和管理PCB&#xff0c;操作系统通常会使用不同的存储方式&#xff0c;其中两种常见的方式是链式存储和索引存储。…

linux的文件系统,理解一切皆文件

1. 系统文件I/O 1.1 open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); pathname: 要打开或创建的目标文件 flags: 打开文件时…

stable diffusion实践操作-VAE

本文专门开一节写图生图相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 大部分底模有VAE&#xff0c;但是部分底模没有VAE&#xff0c;需要专门下载VAE才能使用。 最常用的VAE&#xff1a;vae-ft-mse-840000-ema-pruned 用来饱…

VBA_MF系列技术资料1-172

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

react中使用cytoscape

1. 安装 cytoscape npm install cytoscape 2. 使用 import React, { useEffect, useRef, useState } from "react"; import cytoscape from "cytoscape";const peopleList [{"data": {"id": "1","label": &qu…

ShardingSphere——压测实战

摘要 Apache ShardingSphere 关注于全链路压测场景下&#xff0c;数据库层面的解决方案。 将压测数据自动路由至用户指定的数据库&#xff0c;是 Apache ShardingSphere 影子库模块的主要设计目标。 一、压测背景 在基于微服务的分布式应用架构下&#xff0c;业务需要多个服…

前端、后端面试集锦

诸位读者&#xff0c;我们在工作的过程中&#xff0c;经常会因跳槽而面试。 你开发能力很强&#xff0c;懂得技术也很多&#xff0c;但由于不知道如何组织面试的话术&#xff0c;从而让自己的面试不理想。 面试专栏-前端、后端面试 专栏已组织好面试的话术&#xff0c;为你的…

中国五百强企业用泛微为合同加速,提升数字化办公水平

华谊集团借力泛微&#xff0c;融合企业微信、SAP、WPS、电子签章等多种系统&#xff0c;构建了业务集成、场景驱动的全程数字化合同管理平台。 上海华谊&#xff08;集团&#xff09;公司是由上海市政府国有资产监督管理委员会授权&#xff0c;通过资产重组建立的大型化工企业…

docker搭建个人网盘和私有仓库Harbor

目录 1、使用mysql:5.7和 owncloud 镜像&#xff0c;构建一个个人网盘 2、安装搭建私有仓库 Harbor 1、使用mysql:5.7和owncloud&#xff0c;构建一个个人网盘 1.拉取mysql:5.6镜像&#xff0c;并且运行mysql容器 [rootnode8 ~]# docker pull mysql:5.7 [rootnode8 ~]# doc…

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

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

2023年7月京东打印机行业品牌销售排行榜(京东运营数据分析)

鲸参谋监测的京东平台7月份打印机行业销售数据已出炉&#xff01; 7月份&#xff0c;打印机市场呈现下滑趋势。根据鲸参谋平台的数据可知&#xff0c;当月京东平台打印机的销量为48万&#xff0c;环比下降约28%&#xff0c;同比下降约18%&#xff1b;销售额为4亿&#xff0c;环…

超市商品管理

解决前后端跨域问题 分页 添加 权限 实现逻辑 权限-------中间表联系------->角色---------------中间表---------->用户

Android微信数据库解密2

Android微信数据库解密2 上篇文章讲了下微信数据库密码规则,以及相关的代码. 本篇文章主要讲解下使用xpose获取对应的数据库密码. public class HookModule implements IXposedHookLoadPackage {public static final String TAG "HookModule";Overridepublic voi…

并发编程的关键——LOCK

并发编程的关键——LOCK 锁的分类synchronized万物即可为锁synchronized的实现锁升级 LockAQSLockSupportCLHCAS Lock实现ReentrantLock阻塞方法acquireReadWriteLockReentrantReadWriteLockStampedLock 锁的分类 公平锁/非公平锁&#xff1a; – 公平的意思是多个线程按照申请…

uniapp项目实战系列(4):服务的异步请求,请求服务的二次封装

目录 系列往期文章&#xff08;点击跳转&#xff09;uniapp项目实战系列(1)&#xff1a;导入数据库&#xff0c;启动后端服务&#xff0c;开启代码托管&#xff08;点击跳转&#xff09;uniapp项目实战系列(2)&#xff1a;新建项目&#xff0c;项目搭建&#xff0c;微信开发工具…