Qt(day5)

2023-09-21 20:56:05

思维导图

将登录操作和数据库绑定 

mywnd.h

#ifndef MYWND_H
#define MYWND_H

#include <QMainWindow>
#include<QLabel>
#include<QLineEdit>
#include<QPushButton>
#include<QDebug>
#include<QMessageBox>
#include"second.h"
#include<QSqlDatabase>
#include<QSqlQuery>
#include<QSqlRecord>

QT_BEGIN_NAMESPACE
namespace Ui { class MyWnd; }
QT_END_NAMESPACE

class MyWnd : public QMainWindow
{
    Q_OBJECT

signals:
    void loginbtn_signal();

public slots:
    void registerbtn_slot();
    void loginbtn_slot();
    void cancelbtn_slot();

public:
    MyWnd(QWidget *parent = nullptr);
    ~MyWnd();

private:
    Ui::MyWnd *ui;
    QPushButton *registerbtn;
    QPushButton *loginbtn;
    QPushButton *cancelbtn;
    QLineEdit *usernameedit;
    QLineEdit *passwdedit;
    QLabel *logolab;
    QLabel *usernamelab;
    QLabel *passwdlab;

    Second *s1;

    QSqlDatabase db;
};
#endif // MYWND_H

mywnd.cpp

#include "mywnd.h"
#include "ui_mywnd.h"

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

    //将当前界面的信号,与s1界面的槽函数进行连接
    s1=new Second;
    connect(this,&MyWnd::loginbtn_signal,s1,&Second::jump_slot);

    //对页面进行修改
    this->setFixedSize(QSize(800,700)); //固定文件框的大小
    this->setWindowTitle("华清远见");   //设置文件的标题
    this->setWindowIcon(QIcon(":/icon/wodepeizhenshi.png")); //为标题加图片

    //设置logo图片
    logolab=new QLabel(this);  //构造一个lab,指定父组件
    logolab->resize(800,250);  //设置图片尺寸
    logolab->setPixmap(QPixmap(":/icon/logo.png"));  //设置logo图片
    logolab->setScaledContents(true);   //设置图片自适应

    //设置username图片
    usernamelab=new QLabel(this);  //构造一个lab,指定父组件
    usernamelab->resize(50,50);    //设置图片尺寸
    usernamelab->move(230,300);    //设置图片位置
    usernamelab->setPixmap(QPixmap(":/icon/username.jpg"));  //设置logo图片
    usernamelab->setScaledContents(true);   //设置图片自适应

    //设置passwd图片
    passwdlab=new QLabel(this);  //构造一个lab,指定父组件
    passwdlab->resize(50,50);    //设置图片尺寸
    passwdlab->move(230,380);    //设置图片位置
    passwdlab->setPixmap(QPixmap(":/icon/passwd.jpg"));  //设置logo图片
    passwdlab->setScaledContents(true);   //设置图片自适应

    //设置username输入文本框
    usernameedit=new QLineEdit(this);   //构造一个行编辑器,指定父组件
    usernameedit->resize(300,50);  //设置行编辑器大小
    usernameedit->move(300,300);   //设置行编辑器位置
    usernameedit->setEchoMode(QLineEdit::Normal);  //设置明文模式
    usernameedit->setPlaceholderText("username");  //设置占位符

    //设置passwd输入文本框
    passwdedit=new QLineEdit(this);   //构造一个行编辑器,指定父组件
    passwdedit->resize(300,50);  //设置行编辑器大小
    passwdedit->move(300,380);   //设置行编辑器位置
    passwdedit->setEchoMode(QLineEdit::Password);    //设置密文模式
    passwdedit->setPlaceholderText("passwd");    //设置占位符

    //设置注册按钮
    registerbtn=new QPushButton("注册",this);   //构造注册按键,指定父组件
    registerbtn->resize(380,60);   //设置按键大小
    //registerbtn->setIcon(QIcon(":/icon/login.png"));    //设置按键图标
    registerbtn->move(passwdlab->x(),passwdlab->y()+80); //设置按键位置

    //设置登录按钮
    loginbtn=new QPushButton("登录",this);   //构造登录按键,指定父组件
    loginbtn->resize(380,60);   //设置按键大小
    loginbtn->setIcon(QIcon(":/icon/login.png"));    //设置按键图标
    loginbtn->move(registerbtn->x(),registerbtn->y()+70); //设置按键位置


    //设置取消按钮
    cancelbtn=new QPushButton("取消",this);   //构造取消按键,指定父组件
    cancelbtn->resize(380,60);   //设置按键大小
    cancelbtn->setIcon(QIcon(":/icon/cancel.png"));   //设置按键图标
    cancelbtn->move(loginbtn->x(),loginbtn->y()+70); //设置按键位置

    //注册按键的信号与槽连接
    connect(registerbtn,&QPushButton::clicked,this,&MyWnd::registerbtn_slot);

    //登录按键的信号与槽连接
    connect(loginbtn,&QPushButton::clicked,this,&MyWnd::loginbtn_slot);

    //取消按键的信号与槽连接
    connect(cancelbtn,&QPushButton::clicked,this,&MyWnd::cancelbtn_slot);

    //先判断是否有数据库文件
    if(!db.contains("user.db")){
        //建一个数据库,给定使用的数据库类型
        db=QSqlDatabase::addDatabase("QSQLITE");
        //给刚刚创建的数据库设置名字
        db.setDatabaseName("user.db");
    }

    //打开数据库
    if(!db.open()){
        QMessageBox::information(this,"提示","数据库打开失败");
        return;
    }
    //实例化一个QSqlQuery的类对象
    QSqlQuery query;
    //准备sql语句
    QString sql="create table if not exists user("
                "username varchar(20) primary key,"
                "passwd varchar(20))";
    //执行sql语言
    if(!query.exec(sql)){
        QMessageBox::information(this,"提示","数据表创建失败");
        return;
    }

}

MyWnd::~MyWnd()
{
    delete ui;
}

void MyWnd::registerbtn_slot(){
    if(usernameedit->text()==""||passwdedit->text()==""){
        QMessageBox::information(this,"提示","用户名或密码不能为空");
        return;
    }
    else{
        //将数据获取
        QString username=usernameedit->text();
        QString passwd=passwdedit->text();

        //实例化一个QSqlQuery的类对象
        QSqlQuery query;
        //准备sql语句
        QString sql=QString("insert into user(username,passwd)"
                            "values('%1','%2')").arg(username).arg(passwd);
        //执行sql语句
        if(!query.exec(sql)){
            QMessageBox::information(this,"提示","注册失败");
            return;
        }
        else{
            QMessageBox::information(this,"成功","注册成功");
        }
    }
}

void MyWnd::loginbtn_slot(){
    QMessageBox box(this);      //基于属性版本实现消息对话框
    //将数据获取
    QString username=usernameedit->text();
    //实例化一个QSqlQuery的类对象
    QSqlQuery query;
    //准备sql语句
    QString sql=QString("select * from user where username='%1'").arg(username);
    //执行sql语句
    if(!query.exec(sql)){
        QMessageBox::information(this,"提示","查询失败");
        return;
    }
    QString passwd;
    while(query.next()){
        passwd=query.record().value("passwd").toString();

    }
    if(usernameedit->text()==""||passwdedit->text()==""){
        QMessageBox::information(this,"提示","用户名或密码不能为空");
    }
    else if(usernameedit->text()==username&&passwdedit->text()==passwd){
        box.setIcon(QMessageBox::Information);
        box.setWindowTitle("登陆成功");
        box.setText("登陆成功");
        box.setStandardButtons(QMessageBox::Ok);
        box.setDefaultButton(QMessageBox::Ok);
        box.exec();
        emit loginbtn_signal();     //发射跳转的信号
        this->hide();   //隐藏第一个页面
    }
    else{
        box.setIcon(QMessageBox::Question);
        box.setWindowTitle("匹配错误");
        box.setText("账号密码不匹配,是否重新登录?");
        box.setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
        box.setDefaultButton(QMessageBox::Ok);
        int ret=box.exec();
        if(ret==QMessageBox::Ok){
            usernameedit->clear(); //清空用户框中的内容
            passwdedit->clear(); //清空密码框中的内容
        }
        else{
            this->close();  //关闭页面
        }
    }
}

void MyWnd::cancelbtn_slot(){
    int ret=QMessageBox::warning(this,      //基于静态成员函数版本的消息对话框
                                 "是否退出",
                                 "是否确定要退出登录?",
                                 QMessageBox::Yes|QMessageBox::No,
                                 QMessageBox::No);
    if(ret==QMessageBox::Yes){
        this->close();
    }
}



更多推荐

vue学习-03vue父子组件与ref属性

本篇开始,我们将复习一下上篇的组件引入:App.vue<template><div><imgsrc="./assets/logo.png"alt="logo"><!--编写组件标签--><School></School><Student></Student></div></template><script>//引入组件

CSS中的定位

position的属性与含义CSS中的position属性用于控制元素在页面中的定位方式,有四个主要的取值,每个取值都会影响元素的布局方式,它们是:static(默认值):这是所有元素的初始定位方式。在静态定位下,元素会按照它们在文档流中的顺序依次排列,不受top、right、bottom、left等属性的影响。静态定

c++11相关内容介绍

前言在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯意性的将两个标准合并称为C++98/03标准。从C++0x到

力扣669 补9.16

最近大三上四天有早八,真的是受不了了啊,欧嗨呦,早上困如狗,然后,下午困如狗,然后晚上困如狗,尤其我最近在晚上7点到10点这个时间段看力扣,看得我昏昏欲睡,不自觉就睡了1个小时,可能在犯困的时间段不适合做高难度的题目。还有英语也要抓紧搞,好久没搞英语了,力扣每天一题就搞得我没时间搞别的了,基本就是下午在看力扣,然后睡了

基于Spring Boot的房屋租赁系统

目录前言一、技术栈二、系统功能介绍租客功能模块的实现​编辑管理员功能模块的实现三、核心代码1、登录模块2、文件上传模块3、代码封装前言房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于SpringBoot的房屋租赁系统。本文

Android Studio导入aosp源码

1、在Ubuntu系统下,进入源码根目录,运行如下命令:sourcebuild/envsetup.sh#初始化环境变量。lunchsdk_phone_x86_64makeidegen-j6#六核编译idegen模块忽略此命令:mmmdevelopment/tools/idegen/#此命令可以不执行(同makeideg

【leetcode】数组排序

【leetcode】数组排序task03主要了解了数组中常见的排序方法:1.常见数组排序方法冒泡排序(BubbleSort):冒泡排序是一种简单的排序算法,它多次遍历数组,比较相邻的元素并交换它们,直到整个数组按升序排列。时间复杂度为O(n^2)。选择排序(SelectionSort):选择排序是一种简单的排序算法,它

基于Spring Boot的网上购物商城系统

目录前言一、技术栈二、系统功能介绍用户功能模块的实现管理员功能模块的实现商家功能模块的实现三、核心代码1、登录模块2、文件上传模块3、代码封装前言本课题是根据用户的需要以及网络的优势建立的一个基于SpringBoot的网上购物商城系统,来满足用户网络购物的需求。本网上购物商城系统应用Java技术,MYSQL数据库存储数

汉威科技亮相上海传感器展并发表主题演讲,智能传感器大有可为

9月15日,第8届中国(上海)国际传感器技术与应用展览会圆满落幕,该展会吸引了逾400家传感领域国内外的企业、100余家专业传感应用单位、500余位传感大咖共同参与,展会观众达30000人。作为全球三大传感器展之一的盛会,该展会也被称为全球传感器行业发展的风向标,而智能化则成为本次传感器的主题。展会同期举办的第八届智能

C++---链表

1、链表1.1、链表的结构每个链表开头都有一个头指针Head尾节点的指针域为NULL,用于判断此列表是否结束如果一个链表开始就为NULL,那么该链表为空链表链表中的先后不代表在真实内存中的位置,只是单纯的逻辑上关系1.2、创建链表我们首先利用结构体创建一个Student的结构体//利用链表创建3个学生的信息,学生信息包

【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用

文章目录前言PlayerPrefs一、基本介绍二、Demo三、优缺点JsonUtility一、基本使用二、Demo三、优缺点Mysql(扩展)完结前言游戏存档不言而喻,是游戏设计中的重要元素,可以提高游戏的可玩性,为玩家提供更多的自由和控制权。看完这篇文章就可以构建属于自己的存储系统了。PlayerPrefs它是一个仅

热文推荐