华清 Qt day5 9月21

2023-09-21 20:59:19
QT       += core gui sql network

/*****************************************************************/
#ifndef WIDGET_H
#define WIDGET_H

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


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_btn1_clicked();

    void on_btn2_clicked();

    void on_le1_cursorPositionChanged(int arg1, int arg2);

    void on_le2_cursorPositionChanged(int arg1, int arg2);

    void on_btn3_clicked();

signals:
    void jump();      //定义一个跳转到其他界面的信号

private:
    Ui::Widget *ui;

    Second *s1;

    QSqlDatabase db;   //定义一个数据库的类对象
};
#endif // WIDGET_H

/*****************************************************************/
#ifndef SECOND_H
#define SECOND_H

#include <QDialog>
#include <QTcpSocket>
#include <QMessageBox>

namespace Ui {
class Second;
}

class Second : public QDialog
{
    Q_OBJECT

public:
    explicit Second(QWidget *parent = nullptr);
    ~Second();

public slots:
    void jump_slot();     //自定义了一个槽函数

private slots:
    void on_pushButton_2_clicked();
    void connected_slot();
    void readyRead_slot();

    void on_send_clicked();

    void on_duankai_clicked();

    void disconnected_slot();

private:
    Ui::Second *ui;

    //定义一个客户端指针
    QTcpSocket *socket;

    //定义字符串用于接收用户名
    QString username;
};

#endif // SECOND_H

/*****************************************************************/
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    s1 = new Second;
    connect(this,&Widget::jump,s1,&Second::jump_slot); //将jump信号绑定到Second的槽函数

    //添加一个数据库
    if(!db.contains("id_passwd.db"))
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("id_passwd.db");
    }
    //打开数据库
    if(!db.open())
    {
        QMessageBox::information(this,"失败","数据库打开失败");
        return;
    }
    //创建表格,准备sql语句
    QString sql = "create table if not exists id_passwd("
                  "id varchar(10) primary key,"
                  "passwd varchar(20))";
    //准备语句执行者
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"失败","创建表失败");
    }
}


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

//登录按钮
void Widget::on_btn1_clicked()
{
    QString username = ui->le1->text();
    QString password = ui->le2->text();
    QString sql = QString("select * from id_passwd where id = '%1' "
                          "and passwd  = '%2'").arg(username).arg(password);
    QSqlQuery q;


    //登录成功
    if (q.exec(sql)&&q.next())
    {
        QMessageBox::information(this,"登录成功","登录成功");
        //跳转到其他界面的代码
        emit jump();   //使用关键字emit发射自定义的信号
        this->hide();
    }
    else  //登录失败
    {
        //静态版
        int ret = QMessageBox::critical(this,"登录失败",
                                        "账号密码不匹配,是否重新登录",
                                        QMessageBox::Ok|QMessageBox::Cancel);
        if(ret==QMessageBox::Ok)
        {
            //清楚密码框内容
            ui->le2->clear();
        }
        else if(ret==QMessageBox::Cancel)
        {
            //关闭界面
            close();
        }
    }
}

//取消按钮
void Widget::on_btn2_clicked()
{
    //对象版
    QMessageBox box(QMessageBox::Question,"退出登录","是否确定退出登录?",
                    QMessageBox::Yes|QMessageBox::No,
                    this);
    int ret = box.exec();
    if(ret == QMessageBox::Yes)
    {
        //关闭界面
        close();
    }
}

//输入账号
void Widget::on_le1_cursorPositionChanged(int arg1, int arg2)
{
    ui->le1->setPlaceholderText("账号");
}

//输入密码
void Widget::on_le2_cursorPositionChanged(int arg1, int arg2)
{
    ui->le2->setPlaceholderText("密码");
    ui->le2->setEchoMode(QLineEdit::Password);
    ui->le2->setMaxLength(12);
}

//注册按钮对应的槽函数
void Widget::on_btn3_clicked()
{
    QString id = ui->le1->text();
    QString passwd = ui->le2->text();

    if(id.isEmpty()||passwd.isEmpty())
    {
        QMessageBox::information(this,"提示","填写完整账号或者密码");
        return;
    }
    //准备sql语句
    QString sql = QString("insert into id_passwd(id,passwd)"
                          "values('%1','%2')").arg(id).arg(passwd);

    //准备语句的执行者
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"失败","注册失败");
        return;
    }
    else
    {
        QMessageBox::information(this,"成功","注册成功");
    }
}

/*****************************************************************/
#include "second.h"
#include "ui_second.h"

Second::Second(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Second)
{
    ui->setupUi(this);
    //给客户端指针实例化对象
    socket = new QTcpSocket(this);
    connect(socket,&QTcpSocket::connected,this,&Second::connected_slot);
    connect(socket,&QTcpSocket::readyRead,this,&Second::readyRead_slot);
    connect(socket,&QTcpSocket::disconnected,this,&Second::disconnected_slot);

}

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

void Second::jump_slot()
{
    this->show();     //当接收到信号,展示自己的界面
}

//连接按钮对应的槽函数
void Second::on_pushButton_2_clicked()
{
    //获取UI界面上的相关信息
    username = ui->le_usr->text();
    QString ip = ui->le_ip->text();
    quint16 port = ui->le_port->text().toUInt();
    //将客户端连接到指定的服务器
    socket->connectToHost(ip,port);
    //连接成功的话客户端会自动发送一个connected的信号

}

void Second::connected_slot()
{
    QMessageBox::information(this,"成功","连接服务器成功");
    QString msg = username + ":进入聊天室";
    socket->write(msg.toLocal8Bit());         //将数据发给服务器
}

void Second::readyRead_slot()
{
    //读取服务器发来的信息
    QByteArray msg = socket->readAll();
    //将数据展示到界面
    ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}

//发送按钮对应的槽函数
void Second::on_send_clicked()
{
    //读取UI界面中输入的内容
    QString msg = username + ": " + ui->text->text();
    //发送给服务器
    socket->write(msg.toLocal8Bit());
    ui->text->clear();
}

//断开按钮对应的槽函数
void Second::on_duankai_clicked()
{
    QString msg = username + " 离开服务器";
    socket->write(msg.toLocal8Bit());

    //断开连接
    socket->disconnectFromHost();
    //此时,客户端会自动发射一个disconnected信号
}

void Second::disconnected_slot()
{
    QMessageBox::information(this,"提示","退出成功");
}

 

 

 

 QT - day5 - GitMind

 QT - day4 - GitMind

面试题 - GitMind 

更多推荐

JAVA设计模式6:代理模式,用于控制对目标对象的访问

作者主页:Designer小郑作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。目录一、什么是代理模式二、代理模式实例2.1静态代理2.2动态代理三、代理模式的应用场景四、代理模式面试题一、什么是代理模式代理模式是一种常用

【算法训练-二叉树 四】【对称与翻转】对称二叉树、翻转二叉树

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【二叉树的形态变化】,使用【二叉树】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了L

OPCAE扫盲

目录1基本概念1.1服务器/客户端1.2区域1.3报警/条件1.4事件2条件概念2.1子条件2.2OPCConditions属性2.3Condition质量2.4OPCSubConditions属性2.5Condition定义2.6严重性2.7Condition启用/禁用2.8Area启用/禁用2.9Condition

服务器托管费用包含什么?

服务器托管和服务器租用是有一定区别的,那么服务器托管多少钱一年呢?今天就让小编来讲一讲服务器托管费用包含什么吧?服务器的机柜费。因为是服务器托管,所以不需要IDC服务器商提供服务器,只需要给自己的服务器付租用机柜的费用。通常是1U、2U、4U、半柜、整柜几种租用尺寸。(注:1U=4.445厘米,2U=8.89厘米,以此

Aztec交易架构解析

1.引言前序博客有:Aztec的隐私抽象:在尊重EVM合约开发习惯的情况下实现智能合约隐私完全保密的以太坊交易:Aztec网络的隐私架构Aztec.nr:Aztec的隐私智能合约框架——用Noir扩展智能合约功能AccountAbstraction账号抽象——EIP-4337提案Aztec团队认为:隐私用户体验糟透了。

深入解读什么是期权的内在价值和时间价值?

期权品种越来越丰富,对于大家套利对冲都有很多的选择。而有些初学者对时间价值一直不理解,今天呢,就给大家讲一讲深入解读什么是期权的内在价值和时间价值?本文来自:期权酱01在期权交易过程中,想必大家都会有以下几点疑惑:❑我看对行情了,为什么行情上涨或者下跌。认沽和认购都不赚钱?❑什么是期权的内在价值和时间价值?❑一旦被套,

HTTP网络协议与接口测试逻辑

很多测试人员都做过接口测试,但是聊到接口还是会不太清楚。网络协议:但凡要做接口测试,一定要懂网络协议。目前市场主流的网络协议HTTP1.1,Dubbo2,HTTP2.O(相对较少)HTTP1.1网络协议:搞懂打开浏览器访问一个URL会经历的步骤有哪些?(也就是搞懂了HTTP网络协议的基本交互流程)解析URL,将域名解析

性能测试 —— Jmeter 常用三种定时器

1、同步定时器位置:HTTP请求->定时器->SynchronizingTimer当需要进行大量用户的并发测试时,为了让用户能真正的同时执行,添加同步定时器,用户阻塞线程,知道线程数达到预先配置的数值,才开始执行取样器的操作测试绝对并发,比如秒杀,抢购等场景,结果要用聚合报告查看简单案例:模拟50个用户同时访问百度线程

JMeter 测试脚本编写技巧

是一款开源软件,用于进行负载测试、性能测试及功能测试。测试人员可以使用JMeter编写测试脚本,模拟多种不同的负载情况,从而评估系统的性能和稳定性。以下是编写JMeter测试脚本的步骤。第1步:创建测试计划在JMeter中,测试计划是测试的最高级别,它包含了各种元素和配置,如线程组、断言、监听器等。测试人员需要在JMe

2种方法,jmeter用一个正则提取器提取多个值!

jmeter中,用json提取器,一次提取多个值,这个很多人都会。但是,用正则提取器一次提取多个,是否可以呢?肯定,很多人都自信满满的说,可以!形如:token":“(.?)“,“identity”:”(.?)”写一个这样的正则表达式,不就是可以提取两个了吗!是的,这种做法没有错,但是,你发现一个问题吗?你的“Name

【初阶数据结构】树结构与二叉树的基础概念

君兮_的个人主页勤时当勉励岁月不待人C/C++游戏开发Hello,米娜桑们,这里是君兮_,今天带来数据结构里的重点内容也是在笔试,面试中的常见考点——树与二叉树,其中二叉树又分为很多种,我们先来讲讲基础的内容带大家一步步入门二叉树与其遍历一树的概念及其结构1.树结构中的相关概念2.树的表示二什么是二叉树?1概念2特殊的

热文推荐