QTday5

目录

 网络聊天室服务器

 网络聊天室客户端

 学生管理系统

 网络聊天室服务器

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //实例化一个tcp服务器
    ser=new QTcpServer(this);

}

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

//启动按钮对应的槽函数
void Widget::on_startbtn_clicked()
{
    if(ui->startbtn->text()=="启动"){
        //获取ui界面上的端口号

        //启动服务器
        //将服务器设置为被动监听状态
        if(ser->listen(QHostAddress::Any,ui->portEdit->text().toUInt())==true){
            QMessageBox::information(this,"成功","服务器启动成功");
        }
        else{
            QMessageBox::warning(this,"失败","服务器启动失败");
        }

        //当启动服务器后,如果有客户端发来连接请求,服务器会自动发射一个newConnection信号
        //连接该信号到对应的信号处理槽函数
        //可以放入到widget的构造函数中
        connect(ser,&QTcpServer::newConnection,this,&Widget::new_Connect_slot);


        //将文本内容更改为 关闭
        ui->startbtn->setText("关闭");
    }
    else{
        //关闭服务器
        ser->close();
        //将文本内容更改为启动
        ui->startbtn->setText("启动");
    }
}

//处理信号的槽函数实现
void Widget::new_Connect_slot()
{
    //获取最新连接的客户端套接字
    QTcpSocket *socket=ser->nextPendingConnection();

    //将客户端信息存入容器
    cliList.append(socket);

    //当有客户端向服务器发来数据时,当前这个客户端套接字就会自动发射一个readyRead信号
    connect(socket,&QTcpSocket::readyRead,this,&Widget::readRead_slot);
}

//关于readyRead信号对应的槽函数
void Widget::readRead_slot()
{
    //判断客户端容器中是否有已经退出的客户端,有则删除
    for(int i=0;i<cliList.size();i++){
        //判断当前套接字的状态
        if(cliList[i]->state()==QTcpSocket::UnconnectedState){
            //无效删除
            cliList.removeAt(i);
        }
    }

    //再遍历客户端容器,判断哪个客户端有信息可读
    for(int i=0;i<cliList.size();i++){
        if(cliList[i]->bytesAvailable()!=0){
            //获取当前套接字中待读数据个数,如果为0表示无数据
            QByteArray msg=cliList[i]->readAll();

            //将消息,展示到ui界面
            ui->msgWidget->addItem(QString().fromLocal8Bit(msg));

            //将该消息转发给其他客户端
            for(int j=0;j<cliList.size();j++){
                if(i!=j){
                    cliList[j]->write(msg);
                }
            }
        }
    }
}

 网络聊天室客户端

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

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

    //实例化一个客户端
    cli=new QTcpSocket(this);

    connect(cli,&QTcpSocket::connected,this,&Widget::connected_slot);

    //当客户端接收到服务器的消息,会自动发射一个readyread信号,将该信号连接到槽
    connect(cli,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);

    connect(cli,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}

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

//连接服务器的槽函数
void Widget::on_connectbtn_clicked()
{
    if(ui->connectbtn->text()=="连接服务器"){
        //执行连接服务器的工作,发送连接请求
        cli->connectToHost(ui->ipedit->text(),ui->portedit->text().toUInt());

        //当成功连接服务器后,当前客户端会自动发射一个connected的信号,连接到槽函数

        //将按钮内容更换为断开服务器
        ui->connectbtn->setText("断开服务器");

    }
    else{

        //先向服务器发送一个要下线的消息
        cli->write(QString("%1%2").arg(ui->useredit->text()).arg(":用户下线了").toLocal8Bit());

        //断开服务器
        cli->disconnectFromHost();
        //当成功和客户端与服务器的连接断开时,客户端会自动发送disconnected信号

        //将按钮内容更换为连接服务器
        ui->connectbtn->setText("连接服务器");
    }
}

//连接成功后槽函数
void Widget::connected_slot()
{
    QMessageBox::information(this,"连接成功","连接服务器成功");
}

//信息发射按钮对应的槽函数
void Widget::on_sendbtn_clicked()
{
    //将ui界面的消息发送给服务器
    cli->write(QString("%1%2%3").arg(ui->useredit->text()).arg(":").arg(ui->msgedit->text()).toLocal8Bit());
    //将消息显示在
    QListWidgetItem *item=new QListWidgetItem(QString().fromLocal8Bit(ui->msgedit->text().toLocal8Bit()));
    item->setTextAlignment(Qt::AlignRight);
    ui->listWidget->addItem(item);
    //清空消息框
    ui->msgedit->clear();

}

//处理readyread信号对应的槽函数的实现
void Widget::readyRead_slot()
{
    //将读取的信息存入到ui界面
    ui->listWidget->addItem(QString().fromLocal8Bit(cli->readAll()));
}

//disconnected信号对应的槽函数
void Widget::disconnected_slot()
{
    QMessageBox::information(this,"断开","断开服务器成功");
}

 学生管理系统

 

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

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

    //判断当前数据库操作对象中,是否包含了要处理的数据库
    if(!db.contains("mydb.db")){
        //添加一个数据库到当前数据库
        db=QSqlDatabase::addDatabase("QSQLITE");

        //给数据库设置名字
        db.setDatabaseName("mydb.db");
    }

    //此时,已经创建了该数据库但是还没有打开
    if(!db.open()){
       QMessageBox::warning(this,"失败","数据库打开失败");
       return;
    }

    //数据库打开成功操作数据库
    //准备sql语句
    QString sql="create table if not exists Stu(num int,name char,sex char,score double)";

    //实例化一个sql执行者
    //执行sql语句
    if(!QSqlQuery().exec(sql)){
        QMessageBox::warning(this,"失败","创建数据表失败");
    }

}

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

//添加学员槽函数
void Widget::on_addbtn_clicked(){
    QString sql=QString("insert into Stu values(%1,'%2','%3',%4);").arg(ui->numEdit->text()).arg(ui->nameEdit->text()).arg(ui->sexEdit->text()).arg(ui->scoreEdit->text());
    if(ui->numEdit->text().size()==0 || ui->numEdit->text()==0||ui->sexEdit->text().size()==0||ui->scoreEdit->text()==0){
        QMessageBox::warning(this,"失败","请将信息填写完整");
        return;
    }

    if(!QSqlQuery().exec(sql)){
        QMessageBox::warning(this,"失败","添加数据失败");
        return;
    }
    else{
        QMessageBox::information(this,"成功","添加数据成功");
        return;
    }
}

//查找对应的槽函数
void Widget::on_searchbtn_clicked()
{
    //准备sql语句
    QString sql;
    if(ui->nameEdit->text()==NULL){
        sql="select * from Stu";
    }
    else{
        sql=QString("select * from Stu where name = '%1'").arg(ui->nameEdit->text());
    }

    QSqlQuery query;
    if(!query.exec(sql)){
        QMessageBox::warning(this,"失败","查询失败");
        qDebug()<<query.lastError();
//        ui->stutable->clear();
        return;
    }
    //将查询结果插入ui界面
    int i=0;

    //默认查询结果在无效结果集
    //next将结果集移动到有效结果集
    int res;
    do{
        res=query.next();
//        qDebug()<<res<<i;
        if(res==false&&i==0){
//            qDebug()<<res<<i;
             ui->stutable->clearContents();
        }
        else if(res==false){
            break;
        }
        for(int j=0;j<query.record().count();j++){
            //将数据库中的数据依次存放到ui界面中
            QTableWidgetItem *item=new QTableWidgetItem(query.record().value(j).toString());
            item->setTextAlignment(Qt::AlignCenter);
            ui->stutable->setItem(i,j,item);
        }
        i++;
    }while(res);
}

//删除对应的槽函数
void Widget::on_delbtn_clicked()
{
    //准备sql语句
    QSqlQuery q;
    if(!q.exec(QString("delete from Stu where name = '%1'").arg(ui->nameEdit->text()))){
        QMessageBox::warning(this,"失败","删除失败");
        return;
    }
    else{
        QMessageBox::information(this,"成功","删除成功");
        return;
    }
}

//修改对应的槽函数
void Widget::on_changebtn_clicked()
{
    QSqlQuery q;
    if(!q.exec(QString("update Stu set num=%1,name='%2',sex='%3',score=%4 where name = '%2'").arg(ui->numEdit->text()).arg(ui->nameEdit->text()).arg(ui->sexEdit->text()).arg(ui->scoreEdit->text()))){
        QMessageBox::warning(this,"失败","修改失败");
        return;
    }
    else{
        QMessageBox::information(this,"成功","修改成功");
        return;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot记录】自动配置原理(2):自动配置的案例说明

案例说明 通过前面案例可以很明显感受到&#xff0c;SpringBoot除了做了依赖管理&#xff0c;还帮我们做了一些常规的配置&#xff0c;下面举例详细说明。 tomcat 项目可以直接启动&#xff0c;不需要任何配置&#xff0c;通过上一节发现引入了启动器中引入了spring-boot-st…

Python之数据分析基础

导言&#xff1a; “21世纪的竞争是数据的竞争&#xff0c;谁掌握数据&#xff0c;谁就掌握未来”。如何将大量看似杂乱无章的数据进行聚合&#xff0c;并发现潜在的规律也变得越来越重要。本文将先说明数据分析的步骤&#xff0c;再通过python完成实例数据的处理、分析最终展…

【初阶数据结构】顺序表OJ题讲解

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL。 &#x1f4da;本文收录与初阶数据结构系列&#xff0c;本专栏主要是针对时间、空间复杂度&#xff0c;顺序表和链表、栈和队列、二叉树以及各类排序算法&#xff0c;持…

PyTorch 图像篇

计算机视觉技术是一门包括计算机科学与工程、神经生理学、物理学、信号处理、认知科学、应用数学与统计等多学科的综合性科学技术&#xff0c; 是人工智能的一个重要分支&#xff0c; 目前在智能安防、自动驾驶汽车、医疗保健、生成制造等领域具有重要的应用价值。 计算机视觉…

常用控件(一)

常用控件 一 按钮类控件QPushButtonQRadioButtonQCheckBox 按钮类控件 QPushButton 使用QPushButton表示一个按钮&#xff0c;这是我们当前最熟悉的一个控件了; QPushButton继承自QAbstractButton&#xff0c;这个类是个抽象类&#xff0c;是其他按钮类的父类; QAbstractButt…

anaconda虚拟环境pytorch安装

1.先创建conda的虚拟环境 conda create -n gputorch python3.102.激活刚刚创建好的虚拟环境 conda activate gputorch3.设置镜像源 这一步是后面安装pytorch相关包所需要的来源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple4.查看电脑的显卡…

跨界内容营销:Kompas.ai如何帮助你的品牌打破行业边界

在当今多元化的市场环境中&#xff0c;跨界营销已成为品牌拓展影响力和用户基础的重要策略。通过跨界合作&#xff0c;品牌能够打破行业界限&#xff0c;创造独特的用户体验&#xff0c;从而提升品牌形象和市场竞争力。本文将深入分析跨界营销的作用&#xff0c;详细介绍Kompas…

SliderCaptcha滑块验证码功能

SliderCaptcha滑块验证码功能 资源文件及文档&#xff1a;https://gitee.com/LongbowEnterprise/SliderCaptcha <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><…

mysql 其他类型转换为BIT

看官网说明,BIT没什么特殊之处。但实际操作却不能将任何其他类型字段转为BIT,下面两个都报语法错误 CAST(column AS BIT(1)) AS aa , CAST(column AS BIT) AS bb, BIT value则模式是VARBINARY b1 as cc, -- cc为VARBINARY类型 下面是《高性能MySQL(第四版)》中关于BIT类型的…

cPanel中如何卸载已安装的SSL证书

我使用的Hostease的Linux虚拟主机产品默认带普通用户权限的cPanel面板&#xff0c;由于临时搭建了一个测试的个人的纯静态的网站&#xff0c;不想要安装SSL证书&#xff0c;但是据这边了解HosteaseLinux虚拟主机是只要域名解析指向主机IP&#xff0c;并且绑定到主机&#xff0c…

centos7.9升级4.19内核

centos默认的内核版本是3.10 通过命令 uname -a 输出系统的详细信息 在部署k8s集群时使用默认的3.10版本的内核&#xff0c;容易出各种奇奇怪怪的问题、可以理解为docker和k8s与该内核版本不兼容&#xff0c;所以在部署k8s集群时&#xff0c;务必要升级内核&#xff0c;这里…

引入RabbitMQ

前置条件 docker 安装 mq docker run \-e RABBITMQ_DEFAULT_USERdudu \-e RABBITMQ_DEFAULT_PASS123456 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network hmall \-d \rabbitmq:3.8-management可能会出现&#xff1a;docker: Er…

福昕PDF阅读器取消手型工具鼠标点击翻页

前言&#xff1a; 本文介绍如何关闭福昕PDF阅读器取消手型工具鼠标点击翻页&#xff0c;因为这样真的很容易误触发PDF翻页&#xff0c;使用起来让人窝火。 引用&#xff1a; NA 正文&#xff1a; 新版的福昕PDF阅读器默认打开了“使用手型工具阅读文章”这个勾选项&#x…

五、Redis五种常用数据结构-SET

Redis的Set结构存储的数据和Java中的HashSet类似&#xff0c;都是无序且不重复的。其底层的数据结构有两种&#xff0c;一是当value为整数时&#xff0c;且数据量不大时采用intset来存储。其他情况使用dict字典存储。集合中最多存储232-1(40多亿)个数据。 1、常用命令 sadd k…

Amesim基础篇-热仿真常用模型库-Air Conditioning-Pipes

前言 基于上文对空调库各个元件的介绍&#xff0c;本文进一步将其中的管路展开。 管路介绍 1 摩擦阻力管&#xff08;R&#xff09;&#xff1a; 具有阻力特性的管路&#xff0c;通过管长以及管截面计算阻力。 2 可调节阻力管&#xff08;R&#xff09;&#xff1a; 只具有…

字节薪资解密,张一鸣啥等级?

大家好&#xff0c;我是白露啊。 之前说BAT&#xff0c;可能是指百度、阿里、腾讯&#xff0c;但是现在&#xff0c;这个 B&#xff0c;大多数时候指的是字节跳动了。 随着抖音系产品的流量持续升温&#xff0c;字节跳动已经是一个毋庸置疑的互联网大厂了&#xff0c;不管是想…

小阳的戒S笔记

文章目录 写在前面2024年5月8日21:12:172024年5月9日21:48:242024年5月10日08:04:141、记录昨夜之身体变化2、自身制定之计划1.此亦乃要事&#xff0c;特定问了度娘与GPT&#xff0c;找时间还得咨询专业医师。2.通过跑步宣泄&#xff0c;同时锻炼身体3.我不会有压力&#xff0c…

HFSS学习-day4-建模操作

通过昨天的学习&#xff0c;我们已经熟悉了HFSS的工作环境&#xff1b;今天我们来讲解HFSS中创建物体模型的县体步骤和相关操作。物体建模是HFSS仿真设计工作的第一步&#xff0c;HFSS中提供了诸如矩形、圆面、长方体圆柱体和球体等多种基本模型(Primitive)&#xff0c;这些基本…

Docker学习二(Centos):Docker安装并运行redis(成功运行)

文章目录 前言一、下载并挂载1. 拉取镜像2. 创建挂载目录3. 下载redis.conf文件4. 赋予权限5. 修改redis.conf 默认配置 二、docker运行redis三、检查redis运行状态四、navicat链接redis 前言 一、下载并挂载 1. 拉取镜像 docker pull redis2. 创建挂载目录 fengfanli是我自…

Sarcasm detection论文解析 |基于混合自动编码器的模型对社交媒体平台进行讽刺检

论文地址 论文地址&#xff1a;Electronics | Free Full-Text | Sarcasm Detection over Social Media Platforms Using Hybrid Auto-Encoder-Based Model (mdpi.com) 论文首页 笔记框架 基于混合自动编码器的模型对社交媒体平台进行讽刺检 &#x1f4c5;出版年份:2022 &#x…