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

作业:

完善登录框

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

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

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

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

pro文件:

cpp 复制代码
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

登录界面头文件:

cpp 复制代码
#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

跳转界面头文件:

cpp 复制代码
#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

实现函数:

cpp 复制代码
#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()
{
}

跳转界面实现函数:

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_slots()
{
    this->show();  //显示Second中的组件
}

主函数:

cpp 复制代码
#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.实现文件对话框的保存功能槽函数:

cpp 复制代码
//保存文件按钮的对应槽函数
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键实现小球上下左右移动的键盘按下处理函数:

cpp 复制代码
//键盘按下事件处理函数的定义
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:

相关推荐
Amor风信子几秒前
华为OD机试真题---跳房子II
java·数据结构·算法
我是陈泽3 分钟前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
Mr.Z.41110 分钟前
【历年CSP-S复赛第一题】暴力解法与正解合集(2019-2022)
c++
优雅的小武先生14 分钟前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug
Death20014 分钟前
使用Qt进行TCP和UDP网络编程
网络·c++·qt·tcp/ip
戊子仲秋18 分钟前
【LeetCode】每日一题 2024_10_2 准时到达的列车最小时速(二分答案)
算法·leetcode·职场和发展
邓校长的编程课堂20 分钟前
助力信息学奥赛-VisuAlgo:提升编程与算法学习的可视化工具
学习·算法
虽千万人 吾往矣20 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
创作小达人23 分钟前
家政服务|基于springBoot的家政服务平台设计与实现(附项目源码+论文+数据库)
开发语言·python
郭二哈25 分钟前
C++——list
开发语言·c++·list