qt day 6

news2024/10/7 8:20:49

登录界面

#include "window.h"
#include<QDebug>
#include<QIcon>
Window::Window(QWidget *parent) //构造函数的定义
    : QWidget(parent)           //显性调用父类的构造函数
{
    //判断数据库对象是否包含了自己使用的数据库Student.db
    if(!db.contains("Student.db"))
    {
        //添加一个数据库
        db = QSqlDatabase::addDatabase("QSQLITE");  // 表明使用的是sqlite3版本的数据库
        //给数据库命名
        db.setDatabaseName("St.db");
    }
    //打开数据库
    if(!db.open())
    {
        QMessageBox::information(this,"提示","数据库打开失败");
    }
    //此时说明数据库已经创建并打开了,然后创建数据表
    //创建数据表要用sql语句,用QSQLQuerry类对象来完成
    //准备sql语句
    QString sql = "create table if not exists my("             //创建表的sql语句
                  "name integer primary key,"           //id主键, 允许自增
                  "pass integer)";        //性别  字符串
    //定义语句执行者
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"失败","创建失败");
        return ;
    }
    //
    this->resize(430,330);
    this->resize(QSize(800,600));
    //  this->setMaximumSize(430,330);
     //  this->setMinimumSize(430,330);
    this->setFixedSize(430,330);// 设置尺寸最值
    //窗口标题
    this->setWindowTitle("WeChat");
    //窗口icon
    this->setWindowIcon(QIcon(":/icon/111.png"));
    //设置背景色
    this->setStyleSheet("background-color:skyblue;");
    //设置窗口透明度
    this->setWindowOpacity(1);
    //无参构造
    bt1 =new QPushButton;
    //给组件指定父组件,让其依附于界面
    bt1->setParent(this);
    //设置组件文本内容
    bt1->setText("开始");
    this->setFixedSize(430,330);
    //设置按钮组件的大小
    bt1->resize(QSize(50,30));
   //移动组件位置
    bt1->move(200,290);
    //设置样式表
    bt1->setStyleSheet("background-color:red");
    bt1->setIcon(QIcon("E:\\c\\qt1\\111.png"));
    //2.构造一个按钮
    bt2 = new QPushButton(this);
    bt2->setText("取消");
    bt2->resize(bt1->size());
    bt2->move(300,290);
   // bt2->setStyleSheet("background-color:blue");
   // bt2->setEnabled(false);
    bt2->setIcon(QIcon("E:\\c\\qt1\\111.png"));
    //3.创建图标
    bt3 =new QLabel(this);
    bt3->resize(bt1->size());
    bt3->move(100,170);
    bt3->setPixmap(QString("E:\\c\\qt1\\111.png"));
    //设置 内容自适应
    bt3->setScaledContents(true);

    //2.构造一个按钮
    bt6 = new QPushButton(this);
    bt6->setText("注册");
    bt6->resize(bt1->size());
    bt6->move(100,290);
    bt6->setStyleSheet("background-color:yellow");
    bt6->setIcon(QIcon("E:\\c\\qt1\\111.png"));

    connect(this->bt6,&QPushButton::clicked,this,&Window::bt6_clicked);


    //4.创建图标
    bt4 =new QLabel(this);
    bt4->resize(bt1->size());
    bt4->move(100,220);
    bt4->setPixmap(QString("E:\\c\\qt1\\222.png"));
    //设置 内容自适应
    bt4->setScaledContents(true);
    /***********************************/
    ed1 =new QLineEdit(this);
    //ed1->setText(""); //设置编辑器中的文本
    //设置占位文本
    ed1->setPlaceholderText("密码:");
    //设置尺寸
    ed1->resize(180,30);
    //移动位置
    ed1->move(bt4->x()+60,bt4->y());
    ed1->setPlaceholderText("密码:");
    ed1->setEchoMode(QLineEdit::Password);
    //2.构造一个行编辑器,构造时给定父,以及文本内容
    ed2 = new QLineEdit(this);
    ed2->resize(180,30);
    ed2->move(bt3->x()+60,bt3->y());
    ed2->setPlaceholderText("账号 /手机 /邮箱...");
     /***********************************/
    la1 =new QLabel(this);
    la1 ->resize(430,140);
    la1->setPixmap(QString("E:\\c\\qt1\\222.png"));
    //设置 内容自适应
    la1->setScaledContents(true);

    connect(this->bt1,&QPushButton::clicked,this,&Window::bt1_clicked);
   //
    connect(this,&Window::my_signal,[&](){
        this->close();
    });
    //使用qt4连接,
    connect(bt2,SIGNAL(clicked()),this,SLOT(close()));


}
Window::~Window()
{

}
//补充的注册
void Window::bt6_clicked()
{
    int name_1 = this->ed2->text().toInt();
    QString pass_1 = this->ed1->text();

    if(name_1 == 0 ||pass_1.isEmpty())
    {
        QMessageBox::information(this,"提示","请将数据填写正确");
        return ;
    }
    QSqlQuery querry;

    //准备sql语句
    QString sql2 = QString("select * from my where name = '%1'").arg(name_1);
    if(!querry.exec(sql2))
    {
        QMessageBox::information(this,"提示","注册失败");
        return ;
    }
    else
    {
        QString sql = QString("insert into my(name,pass)"
                      "values('%1', '%2')").arg(name_1).arg(pass_1);
        if(!querry.exec(sql))
        {
            QMessageBox::information(this,"提示","注册失败");
            return ;
        }
        QMessageBox::information(this,"提示","注册成功");
    }

}

void Window::bt1_clicked()
{
    QMessageBox box(QMessageBox::Critical,
                    "错误","密码错误",QMessageBox::Yes|QMessageBox::No,
                    this);
    QMessageBox box2(QMessageBox::Critical,
                    "错误","账号错误",QMessageBox::Yes|QMessageBox::No,
                    this);
    QMessageBox box3(QMessageBox::Information,
                    "信息","登录成功",QMessageBox::Ok|QMessageBox::Cancel,
                    this);

    int name_1 = this->ed2->text().toInt();
    QString pass_1 = this->ed1->text();

    if(name_1 == 0 ||pass_1.isEmpty())
    {
        QMessageBox::information(this,"提示","请将数据填写正确");
        return ;
    }
    QSqlQuery querry;


    QString sql = QString("select * from my where name = '%1' and pass = '%2'").arg(name_1).arg(pass_1);
    if(querry.exec(sql))
    {
            if(querry.next())
            {
                qDebug()<<"登录成功";
                int rew =box3.exec();
                if(rew ==QMessageBox::Ok)
                {
                    emit jump();
                    emit my_signal();
                }
                else {
                    int ret =QMessageBox::question(this,
                                                   "问题",
                                                   "是否取消登录",
                                                   QMessageBox::Yes|QMessageBox::No,
                                                   QMessageBox::Yes);
                    if(ret ==QMessageBox::Yes)
                    {
                        emit my_signal();
                    }
                }

        }
        else{
         int ret =box.exec();
         if(ret ==QMessageBox::Yes)
         {
             Window::ed1->setText("");
         }
         else
             this->close();
        }
     }
    else
    {
        qDebug()<<"账号错误";
        int rex =box2.exec();
        if(rex ==QMessageBox::Yes)
        {
            Window::ed1->setText("");
            Window::ed2->setText("");
        }
        else
            this->close();

    }
}

 查找:

void Widget::on_serchBtn_clicked()
{
    int numb_ui = ui->numbEdit->text().toInt();
    //准备sql语句
    QString sql = QString("select * from myTable where numb = '%1'").arg(numb_ui);
    //准备语句执行者
    QSqlQuery querry;
    //执行sql语句
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"失败","查询失败");
        return ;
    }
    int i = 0;
    while (querry.next()) {
        int k =1;
        // 将查询结果插入到QTableWidget中
        for (int j = 4; j < 8; j++) {
            ui->tableWidget->setItem(i,j-4,new QTableWidgetItem(querry.record().value(k).toString()));
            k++;
        }
        i++;
    }
}

 

网络聊天室,客户端

#include "widget.h"
#include "ui_widget.h"

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

    ui->disconbtn->setEnabled(false);

    //给客户端指针实例化空间
    socket = new QTcpSocket(this);
    //如果连接服务器成功,该客户端就会发射一个connected的信号
    //我们可以将该信号连接到自定义的槽函数中处理相关逻辑
    //由于该连接只需要连接一次,所以写在构造函数
    connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
    //客户端与服务器连接成功后,如果服务器向客户端发来数据,那么该客户端就会自动发射一个readyRead信号
    //我们可以将该信号连接到自定义的槽函数中处理相关逻辑
    connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);

    //当客户端与服务器断开连接后,该客户端就会自动发射一个disconnected的信号
    //我们可以将该信号与自定义的槽函数连接
    //由于只要连接一次,所以写在构造函数
    connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);

}

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


void Widget::on_conbtn_clicked()
{
    //获取ui界面的信息
    userName = ui->usernameLab->text();    //获取用户名
    QString hostName = ui->ipEdit->text();  //获取ip
    quint16 port = ui->portEdit->text().toUInt();   //获取port
    //调用函数链接到主机
    //参数1:服务器的主机地址
    //参数2:端口号
    socket->connectToHost(hostName,port);
    //如果连接服务器成功,该客户端就会发射一个connected的信号
    //我们可以将该信号连接到自定义的槽函数中处理相关逻辑
    //由于该连接只需要连接一次,所以写在构造函数
    ui->conbtn->setEnabled(false);
    ui->disconbtn->setEnabled(true);
    ui->usernameLab->setEnabled(false);
    ui->ipEdit->setEnabled(false);
    ui->portEdit->setEnabled(false);
}
//关于处理connected信号的槽函数的定义
void Widget::connected_slot()
{
    QMessageBox::information(this,"成功","连接服务器成功");
    //顺便向服务器发送一条消息xxx进入聊天室
    QString msg = userName +": 进入聊天室";
    socket->write(msg.toLocal8Bit());

}
//关于处理readyRead信号的槽函数的定义
void Widget::readyRead_slot()
{
    //读取该客户端中的数据
    QByteArray msg = socket->readAll();
    //将数据展示在ui界面
    ui->msglist->addItem(QString::fromLocal8Bit(msg));
}
//发送按钮对应的槽函数
void Widget::on_sendbtn_clicked()
{
    //获取ui界面编辑的文本内容
    QString m =ui->msgEdit->text();
    //整合发送的信息
    QString msg =userName+":"+m;
    //将消息发送给服务器
    socket->write(msg.toLocal8Bit());
    //将消息编辑器中的内容清空
    ui->msgEdit->clear();
}
//断开服务器按钮对应的槽函数
void Widget::on_disconbtn_clicked()
{
    //准备要发送人的信息
    QString msg =userName+":离开聊天室";
    socket->write(msg.toLocal8Bit());
    //调用成员函数disconnectFromHost
    //功能:断开客户端与服务器的连接
    socket->disconnectFromHost();
    //当客户端与服务器断开连接后,该客户端就会自动发射一个disconnected的信号
    //我们可以将该信号与自定义的槽函数连接
    //由于只要连接一次,所以写在构造函数
    socket->write(msg.toLocal8Bit());
    ui->conbtn->setEnabled(true);
    ui->disconbtn->setEnabled(false);
    ui->usernameLab->setEnabled(true);
    ui->ipEdit->setEnabled(true);
    ui->portEdit->setEnabled(true);
}
//关于处理disconnected信号的槽函数的定义
void Widget::disconnected_slot()
{
    QMessageBox::information(this,"退出","退出服务器");
    //顺便向服务器发送一条消息xxx退出聊天室
    QString msg = userName +": 退出聊天室";

}

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

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

相关文章

20230904 QT客户端服务器搭建聊天室

Ser cpp#include "app.h" #include "ui_app.h"APP::APP(QWidget *parent):QWidget(parent),ui(new Ui::APP) {ui->setupUi(this);this->resize(550,400);ui->Line->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中ui->Line->se…

爬虫源码---爬取自己想要看的小说

前言&#xff1a; 小说作为在自己空闲时间下的消遣工具&#xff0c;对我们打发空闲时间很有帮助&#xff0c;而我们在网站上面浏览小说时会被广告和其他一些东西影响我们的观看体验&#xff0c;而这时我们就可以利用爬虫将我们想要观看的小说下载下来&#xff0c;这样就不会担…

突破瓶颈:如何应对高级职位的面试

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

K8S自动化运维容器Docker集群

K8S&#xff1a;K8S自动化运维容器化(Docker)集群 一.k8s概述 1.k8s是什么 &#xff08;1&#xff09;K8S全程为Kubernetes&#xff0c;由于K到S直接有8个字母简称为K8S。 &#xff08;2&#xff09;版本&#xff1a;目前一般是1.18~1.2.0&#xff0c;后续可能会到1.24-1.2…

Qt 开发 CMake工程

Qt 入门实战教程&#xff08;目录&#xff09; 为何要写这篇文章 目前CMake作为C/C工程的构建方式在开源社区已经成为主流。 企业中也是能用CMake的尽量在用。 Windows 环境下的VC工程都是能不用就不用。 但是&#xff0c;这个过程是非常缓慢的&#xff0c;所以&#xff0…

Linux 学习笔记(2)—— 关于文件和目录

目录 1、切换目录 2、查看系统信息 3、文本的创建和编辑 3-1&#xff09;创建文件 3-2&#xff09;查看文件 3-3&#xff09;输出重定向和追加重定向 3-4&#xff09;使用 vi 编辑器编辑文件 4、文件和文件夹的处理 4-1&#xff09;对文件的处理 4-2&#xff09;查看…

avue实现用户本地保存自定义配置字段属性及注意事项(基于tj-vue2-tools)

avue实现用户本地保存自定义配置字段属性及注意事项&#xff08;基于tj-vue2-tools&#xff09; tj-vue2-tools项目地址&#xff1a;https://www.npmjs.com/package/tj-vue2-tools 文档请看项目官方 依赖js-base64 安装依赖 npm install js-base64安装 npm install tj-vue2-t…

Linux代码初试__进度条

前言 在我们的日常生活中&#xff0c;进度条是十分常见的&#xff0c;比如在软件下载中&#xff0c;应用加载中等等~~~那么进度条有什么特点&#xff1f;他又如何实现。 下面我们将结合下面的图展开讲解 一、前置理论知识 1.1回车和换行的区别 在我们的日常生活中&#x…

qt连接tcp通信和连接数据库

通过数据库实现学生管理系统 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库 Studemt.dbif(!db.co…

国产集成开发环境工具 CEC-IDE

本周&#xff0c;国内首款适配国产操作系统、自主可控的集成开发环境工具 CEC-IDE 终于开放下载了。公开报道显示&#xff0c;这款集成开发环境工具由数字广东公司联合麒麟软件打造&#xff0c;于今年 6 月份首次亮相。本周&#xff0c;软件上线仅几天内就在知乎和 GitHub 上引…

《存储IO路径》专题:块设备层多队列blk-mq架构

我们想象一下&#xff0c;你是一个餐厅的厨师&#xff0c;你要准备很多不同的菜肴&#xff0c;而每种菜肴需要不同的食材和烹饪时间。如果每道菜都按照需要的顺序来准备&#xff0c;那么你的工作效率一定会非常低。为了提高效率&#xff0c;你会怎么做呢&#xff1f; 在linux架…

分布式 - 服务器Nginx:基础系列之Nginx静态资源优化配置指令sendfile | tcp_nopush | tcp_nodelay

文章目录 1. sendfile 指令2. tcp_nopush 指令3. tcp_nodelay 指令 1. sendfile 指令 请求静态资源的过程&#xff1a;客户端通过网络接口向服务端发送请求&#xff0c;操作系统将这些客户端的请求传递给服务器端应用程序&#xff0c;服务器端应用程序会处理这些请求&#xff…

qt day5 数据库,tcp

数据库 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase>//数据库管理类 #include <QSqlRecord>//记录类 #include <QSqlQuery>//执行sql语句对应的类 #include <QMessageBox> #include<QDebug> …

Linux命令200例:man用于显示和阅读关于Linux内置命令的使用说明

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

玻璃工艺品可以走墨西哥专线吗?

玻璃工艺品作为一种精美独特的艺术品&#xff0c;经常被人们用来装饰家居或作为礼品赠送。然而&#xff0c;对于想要将这些玻璃工艺品运往墨西哥的商家或个人来说&#xff0c;如何选择最便捷的运输方式成为一个重要的问题。那么&#xff0c;玻璃工艺品可以走墨西哥专线吗? 墨西…

VSCode配置Python以及扩展

无论您是经验丰富的开发人员还是刚刚开始编码冒险&#xff0c;正确设置 VS Code 都可能是将您的技能提升到新水平的秘诀。因此&#xff0c;让我们深入探索在 Visual Studio Code 的虚拟墙内打造崇高编码天堂的艺术&#xff01; 为什么选择 VS 代码&#xff1f; VS Code 已成为 …

探索iVX:颠覆传统低代码平台的新潮流

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

判断对象是否发生变化,常用于监听页面表单是否修改并给出保存提示

本文主要封装方法&#xff0c;实现用户离开表单编辑页面时弹出提示框&#xff0c;若表单数据发生变化&#xff0c;则提示用户是否保存当前页面的信息&#xff0c;如图&#xff1a; 封装方法&#xff1a; /*** 比较俩个对象之间的差异&#xff0c;项目中多处用到监听表单数据是…

一文入门Web网站安全测试

文章目录 Web网页安全风险评估1. 数据泄漏2. 恶意软件传播3. 身份伪装和欺诈 测试Web网页的安全性常见方法和工具漏洞扫描器手动漏洞测试漏洞利用工具Web应用程序防火墙&#xff08;WAF&#xff09;测试渗透测试代码审查社会工程学测试 推荐阅读 Web网页安全风险评估 越来越多…

L1-058 6翻了(Python实现) 测试点全过

前言&#xff1a; {\color{Blue}前言&#xff1a;} 前言&#xff1a; 本系列题使用的是&#xff0c;“PTA中的团体程序设计天梯赛——练习集”的题库&#xff0c;难度有L1、L2、L3三个等级&#xff0c;分别对应团体程序设计天梯赛的三个难度。更新取决于题目的难度&#xff0c;…