day5Qt作业

 服务器端

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

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

    //准备组件,初始化组件状态
    this->setFixedSize(800,600);
    chatwidget = new QListWidget(this);
    chatwidget->setFixedSize(800,430);
    chatwidget->setEnabled(false);
    portedit = new QLineEdit(this);
    portedit->resize(400,50);
    portedit->move(80,480);
    startbtn = new QPushButton("启动",this);
    startbtn->setStyleSheet("background-color:red");
    startbtn->resize(150,80);
    startbtn->move(520,465);

    //startbtn按钮的点击信号与槽函数连接
    connect(startbtn,&QPushButton::clicked,this,&Widget::startbtn_slot);

    ser = new QTcpServer(this);//实意化服务器类对象

    connect(ser,&QTcpServer::newConnection,this,&Widget::serconnect_slot); //连接 每当新的客户端连接,服务器发出的newconection信号 与对应的槽函数

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

//startbtn按钮的点击信号对应的槽函数
void Widget::startbtn_slot()
{
    if(startbtn->text() == "启动")
    {

        //启动按钮后调用监听
        int port = portedit->text().toUInt();//获取行编辑器输入的端口号
        if(port<1024 || port>49151)
        {
            QMessageBox::information(this,"提示","端口号不可用");
            return;
        }

        if(ser->listen(QHostAddress::Any,port)==true)//设置服务器的IP地址端口号,监听状态
        {
            //启用聊天窗口,禁用端口行编辑器,设置按钮背景色
            chatwidget->setEnabled(true);
            portedit->setEnabled(false);
            startbtn->setStyleSheet("background-color:blue");
            QMessageBox::information(this,"成功","服务器启动成功");
            startbtn->setText("关闭");//启动后将按钮文本设置为关闭

        }
        else
        {
            QMessageBox::information(this,"失败","服务器启动失败");

        }
    }
    else if(startbtn->text() == "关闭")
    {

        chatwidget->setEnabled(false);
        portedit->setEnabled(true);
        startbtn->setStyleSheet("background-color:red");
        QMessageBox::information(this,"成功","服务器关闭");

        startbtn->setText("开启");//启动后将按钮文本设置为开启

    }
}

//服务器发出的newconection信号对应的槽函数处理
void Widget::serconnect_slot()
{
    QTcpSocket *socket = ser->nextPendingConnection();//返回连接到的客户端信息

    clilist.append(socket);//将信息放到容器中保存

    //每当有客户端向服务器发送数据时,socket会向服务器发送一个readyread信号
    connect(socket,&QTcpSocket::readyRead,this,&Widget::socket_readyread);//将所连接客户端的服务器都连接到槽函数
}

//处理socket发送的readyread信号的槽函数
void Widget::socket_readyread()
{
    //在这个函数内就可以实现数据收发
    //先遍历链表中的客户端,如果是无效链接则删除掉
    for(int i=0;i<clilist.length();i++)
    {
        //判断连接状态
        if(clilist[i]->state() == QTcpSocket::UnconnectedState) //判断这个链接状态是否是无效链接
        {
            //是则删除
            clilist.removeAt(i);
        }
        //不是无效链接判断是否有数据待读
        else if(clilist[i]->bytesAvailable() != 0)
        {
            QByteArray msg = clilist[i]->readAll();//将客户端发来的数据督导msg里面
            chatwidget->addItem(QString::fromLocal8Bit(msg));//将信息展示在聊天框上
            //遍历转发除了发送信息客户端
            for(int j=0;j<clilist.length();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);
    this->setFixedSize(800,600);
    chatwidget = new QListWidget(this);
    chatwidget->resize(800,400);
    chatwidget->setEnabled(false);

    usrlab = new QLabel("用户名",this);
    usrlab->move(30,470);
    usredit = new QLineEdit(this);
    usredit->move(90,460);
    usredit->resize(300,30);

    iplab = new QLabel("ip",this);
    iplab->move(30,510);
    ipedit = new QLineEdit(this);
    ipedit->move(90,500);
    ipedit->resize(300,30);


    portlab = new QLabel("port",this);
    portlab->move(30,545);
    portedit = new QLineEdit(this);
    portedit->move(90,540);
    portedit->resize(300,30);

    msgedit = new QLineEdit(this);
    msgedit->move(90,410);
    msgedit->resize(400,40);
    msgedit->setEnabled(false);

    sendbtn = new QPushButton("发送",this);
    sendbtn->move(510,408);
    sendbtn->resize(150,47);
//    sendbtn->setStyleSheet("background-color:red");
    sendbtn->setEnabled(false);

    connectbtn = new QPushButton("连接服务器",this);
    connectbtn->move(480,490);
    connectbtn->resize(200,80);
    connectbtn->setStyleSheet("background-color:red");

    cli = new QTcpSocket(this);//实意化客户端类对象

    //点击连接服务器按钮的信号与槽函数连接

    connect(connectbtn,&QPushButton::clicked,&Widget::connectbtn_slot);
    connect(sendbtn,&QPushButton::clicked,&Widget::sendbtn_slot);

    //客户端连接信号与槽函数连接
    connect(cli,&QTcpSocket::connected,this,&Widget::connected_slot);
    connect(msgedit,&QLineEdit::textChanged,this,&Widget::sentbtn_available_slot);


}

void Widget::connected_slot()
{
     QMessageBox::information(this,"连接","连接服务器成功!!");
}

void Widget::connectbtn_slot()
{
    //一按钮两用
    if(connectbtn->text()=="连接服务器")
    {
        //点击连接服务器之后获取行编辑器的文本信息
        QString usrname=usredit->text();
        quint16 port=portedit->text().toUInt();
        QString ip=ipedit->text();

        //连接整个后禁用服务器端信息编辑,启用聊天窗口和信息编辑器
        chatwidget->setEnabled(true);
        msgedit->setEnabled(true);
        usredit->setEnabled(false);
        ipedit->setEnabled(false);
        portedit->setEnabled(false);



        //向给定的IP地址端口号发送链接请求
        cli->connectToHost(ip,port);

        connectbtn->setText("断开服务器");

        //连接成功后会发送cli会发送一个connected信号,对这个信号处理即可
    }
    else
    {

        //断开连接整个后启用服务器端信息编辑,禁用聊天窗口和信息编辑器

        usredit->setEnabled(true);
        ipedit->setEnabled(true);
        portedit->setEnabled(true);
        chatwidget->setEnabled(false);
        sendbtn->setEnabled(false);
        msgedit->setEnabled(false);
        QString msg = usrname + "离开聊天室" ;
        cli->write(msg.toLocal8Bit());
        cli->disconnectFromHost();
        connectbtn->setText("连接服务器");
    }
}

void Widget::sendbtn_slot()
{
    QString msg= usrname + ":" + msgedit->text();
    cli->write(msg.toLocal8Bit());
    QString msg1=msgedit->text();
    QListWidgetItem *Item=new QListWidgetItem(msg1);
    Item->setTextAlignment(Qt::AlignRight);   //自己发送的文本右边显示
    chatwidget->addItem(Item);
    msgedit->clear();
}



//处理readyread对应槽函数
void Widget::readyRead_slot()
{
    QByteArray msg =cli->readAll();
    chatwidget->addItem(QString::fromLocal8Bit(msg));

}


void Widget::disconnect_slot()
{
    QMessageBox::information(this,"断开","断开服务器连接成功");
}

void Widget::sentbtn_available_slot()
{
    if(msgedit->text().length()>0)
    {
        sendbtn->setEnabled(true);
    }
}

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







 学生管理系统

#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::information(this,"失败","数据库打开失败");
        return;
    }
    QString sql = "create table if not exists Stu(numb int ,name char,sex char,score float);";
    QSqlQuery query;
    if(query.exec(sql)==false)
    {
        QMessageBox::information(this,"提示","创建数据表失败");
        return;
    }

}

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


void Widget::on_addbtn_clicked()
{
    ui->tableWidget->clear();
    //QString sql = QString(%1)
    int ui_numb=ui->numbedit->text().toUInt();
    QString ui_name= ui->nameedit->text();
    QString ui_sex = ui->sexedit->text();
    float ui_score = ui->scoreedit->text().toFloat();
    if(ui_sex==NULL || ui_numb==0 || ui_score==0 || ui_name==NULL)
    {
        QMessageBox::information(this,"提示","请将信息填写完整");
        return;
    }
    else if(!(ui_sex == "男" || ui_sex == "女"))
    {

        QMessageBox::information(this,"提示","性别信息错误");
        return;
    }
    QString sql = QString("insert into Stu values(%1,'%2','%3',%4);").arg(ui_numb).arg(ui_name).arg(ui_sex).arg(ui_score);

    QSqlQuery query;
    if(query.exec(sql))
    {
        QMessageBox::information(this,"提示","添加数据成功");
        ui->numbedit->clear();
        ui->nameedit->clear();
        ui->sexedit->clear();
        ui->scoreedit->clear();
        return;
    }
    else
    {
        QMessageBox::information(this,"提示","添加数据失败");
        return;
    }
}

void Widget::on_searchbtn_clicked()
{
    ui->tableWidget->clear();
    QString sql;
    if(ui->numbedit->text()==NULL)
    {
        sql = "select * from Stu";
    }
    else
    {
        sql = QString("select * from stu where numb=%1;").arg(ui->numbedit->text());
    }
    QSqlQuery query;
    if(!query.exec(sql))
    {
        QMessageBox::information(this,"提示","查询失败");
        return;
    }
    int i=0;
    while(query.next())
    {
        //任意一个查询的结果
        //qDebug() << query.record().value(1).toString();
        for(int j=0;j<query.record().count();j++)
        {
            qDebug() << query.record().value(j).toString();
            QTableWidgetItem *Item=new QTableWidgetItem(query.record().value(j).toString());
            Item->setTextAlignment(Qt::AlignCenter);
            ui->tableWidget->setItem(i,j,Item);

        }
        i++;
    }
}

void Widget::on_updatabtn_clicked()
{

    ui->tableWidget->clear();
    int ui_numb=ui->numbedit->text().toUInt();
    QString ui_name= ui->nameedit->text();
    QString ui_sex = ui->sexedit->text();
    float ui_score = ui->scoreedit->text().toFloat();
    if(ui_sex==NULL || ui_numb==0 || ui_score==0 || ui_name==NULL)
    {
        QMessageBox::information(this,"提示","请将信息填写完整");
         return;
    }
    else if(!(ui_sex == "男" || ui_sex == "女"))
    {

        QMessageBox::information(this,"提示","性别信息错误");
        return;
    }
    //QString sql = QString("update Stu set numb=%1 where name='%2'").arg(ui_numb).arg(ui_name);
    //qDebug() << sql;
    QString sql = QString("update Stu set name='%1',sex='%2',score=%3 where numb=%4;").arg(ui_name).arg(ui_sex).arg(ui_score).arg(ui_numb);
    QSqlQuery query;
    if(query.exec(sql))//
    {
        QMessageBox::information(this,"提示","修改数据成功");
        ui->numbedit->clear();
        ui->nameedit->clear();
        ui->sexedit->clear();
        ui->scoreedit->clear();
        return;
    }
    else
    {
        QMessageBox::information(this,"提示","修该数据失败");
        query.lastError();
        return;
    }
}
//lasrError

void Widget::on_delbtn_clicked()
{
    ui->tableWidget->clear();
    int ui_numb=ui->numbedit->text().toUInt();
    if( ui_numb==0 )
    {
        QMessageBox::information(this,"提示","请填写正确学号");
        return;
    }
    QString sql = QString("delete from Stu where numb=%1;").arg(ui_numb);
    QSqlQuery query;
    if(query.exec(sql))//
    {
        QMessageBox::information(this,"提示","删除数据成功");
        ui->numbedit->clear();
        ui->nameedit->clear();
        ui->sexedit->clear();
        ui->scoreedit->clear();
        return;
    }
    else
    {
        QMessageBox::information(this,"提示","删除数据失败");
        query.lastError();
        return;
    }
}

void Widget::on_sortbtn_clicked()
{

   //  int ui_numb=ui->numbedit->text().toUInt();
//     QMessageBox box(QMessageBox::Question,"选择","请选择学号或者分数排序",QMessageBox::Ok|QMessageBox::Save);
//     box.setDefaultButton(QMessageBox::Ok);
//     box.setButtonText(QMessageBox::Ok,"学号");
//     box.setButtonText(QMessageBox::Save,"分数");
//     int res = box.exec();
//     QString sql;
//     if(res==QMessageBox::Ok)
//     {
//        sql = QString("select * from Stu order by numb asc");
//     }
//     else if(res==QMessageBox::Save)
//     {
//         sql = QString("select * from Stu order by score asc");
//     }

     QString sql="select * from Stu ORDER BY score;";
     QSqlQuery query;
     ui->tableWidget->clear();
     if(query.exec(sql))//
     {
         QMessageBox::information(this,"提示","更改排序成功");
         ui->numbedit->clear();
         ui->nameedit->clear();
         ui->sexedit->clear();
         ui->scoreedit->clear();
         return;
     }
     else
     {
         QMessageBox::information(this,"提示","更改排序失败");
         query.lastError();
         return;
     }

}

 

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

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

相关文章

使用Matplotlib绘制正弦和余弦函数曲线

前言 在数据可视化领域&#xff0c;Matplotlib是一个功能强大的Python库&#xff0c;它允许用户创建各种静态、交互式和动画图形。本文将引导您通过一个简单的示例&#xff0c;学习如何使用Matplotlib绘制正弦和余弦函数曲线。 第一步&#xff1a;导入必要的库&#xff1a; …

【智能优化算法】卷尾猴搜索算法(Capuchin search algorithm,CapSA)

【智能优化算法】卷尾猴搜索算法(Capuchin search algorithm,CapSA)是期刊“NEURAL COMPUTING & APPLICATIONS”&#xff08;IF 6.0&#xff09;的2021年智能优化算法 01.引言 【智能优化算法】卷尾猴搜索算法(Capuchin search algorithm,CapSA)用于解决约束和全局优化问…

【JVM】垃圾回收机制(Garbage Collection)

目录 一、什么是垃圾回收&#xff1f; 二、为什么要有垃圾回收机制&#xff08;GC&#xff09;&#xff1f; 三、垃圾回收主要回收的内存区域 四、死亡对象的判断算法 a&#xff09;引用计数算法 b&#xff09;可达性分析算法 五、垃圾回收算法 a&#xff09;标记-清除…

OSPF虚链路

原理概述 通常情况下&#xff0c;一个OSPF网络的每个非骨干区域都必须与骨干区域通过ABR路由器直接连接&#xff0c;非骨干区域之间的通信都需要通过骨干区域进行中转。但在现实中&#xff0c;可能会因为各种条件限制&#xff0c;导致非骨干区域和骨干区域无法直接连接&#x…

Redis缓存雪崩,击穿,穿透问题

缓存雪崩、击穿、穿透、发生的背景 ​ 作者最近在写一个社区论坛项目&#xff0c;初始设想将论坛里用户发布的帖子内容存到数据库中&#xff0c;当用户访问论坛里的帖子时&#xff0c;帖子信息都从数据库中查。众所周知数据库的帖子数据是存在磁盘中的&#xff0c;而磁盘读写数…

串口初始化自己独立的见解--第九天

1.SM0,SM1 我们一般用 8位UART&#xff0c;波特率可变 &#xff08;方式1的工作方式&#xff09; SCON &#xff1a;SM2 一般不用&#xff0c;SM0 0 ,SM1 1 PCON : 有两位 我们不动它&#xff0c;不加速&#xff0c;初始值 TMOD&#xff1a;8位自动重装定时器&#xff0…

ADS基础教程11 - TouchStone文件的导出及导入

目录 一、 T o u c h S t o n e 介绍 \color{#4285f4}{ \mathbf{ 一、TouchStone介绍}} 一、TouchStone介绍 二、文件导出、导入方式 \color{#4285f4}{ \mathbf{ 二、文件导出、导入方式}} 二、文件导出、导入方式1.原理图操作1&#xff09;原理图中导出2.原理图中导入 3.DDW中…

Python图形复刻——绘制母亲节花束

各位小伙伴&#xff0c;好久不见&#xff0c;今天学习用Python绘制花束。 有一种爱&#xff0c;不求回报&#xff0c;有一种情&#xff0c;无私奉献&#xff0c;这就是母爱。祝天下妈妈节日快乐&#xff0c;幸福永远&#xff01; 图形展示&#xff1a; 代码展示&#xff1a; …

详解分布式锁

知识点&#xff1a; 单体锁存在的问题&#xff1a; 单体锁&#xff0c;即单体应用中的锁&#xff0c;通过加单体锁&#xff08;synchronized或RentranLock&#xff09;可以保证单个实例并发安全 单体锁是JVM层面的锁&#xff0c;只能保证单个实例上的并发访问安全 如果将单…

消除试卷手写笔迹的软件免费的有哪些?这几款都不错

消除试卷手写笔迹的软件免费的有哪些&#xff1f;在数字化学习的浪潮中&#xff0c;学生们越来越频繁地利用电子设备来完成学习任务。然而&#xff0c;当纸质试卷需要被数字化并再次利用时&#xff0c;如何高效地消除手写笔迹便成为了一个有待解决的问题。那么&#xff0c;今天…

【Linux】简易进度条的实现

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中进度条的实现的相关内容。 如果看到最后您觉得这篇文章写得…

coherence protocal基础

一致性整体抽象 coherence protocol是通过保证如下的两点invariants&#xff0c;来实现一致性的&#xff1b; SWMR invariant, 对于任何一个地址&#xff0c;任何时刻&#xff0c;都只会有一个core写&#xff0c;可能会有多个core读&#xff1b;Data-value invariant&#xf…

每天五分钟深度学习:数学中的极值

本文重点 在数学领域中,极值是一个极其重要的概念,它不仅在纯数学理论研究中占据核心地位,而且在工程、物理、经济等实际应用领域也发挥着不可替代的作用。极值问题涉及函数的最大值和最小值,是微积分学中的一个基本问题。本文旨在详细介绍数学中的极值概念、性质、求解方…

Python查询PostgreSQL数据库

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; Python与PostgreSQL的连接 需要了解如何在Python中连接到PostgreSQL数据库。这通常涉及到使用一个库&#xff0c;如psycopg2&#xff0c;它是Python中用于PostgreSQL的最流行的适配器。安装psycopg2非常简单&#x…

202466读书笔记|《一天一首古诗词》——借问梅花何处落,风吹一夜满关山

202466读书笔记|《一天一首古诗词》——借问梅花何处落&#xff0c;风吹一夜满关山 上册下册 《一天一首古诗词》作者李锡琴&#xff0c;蛮早前加入书架的已购买书籍&#xff0c;这次刚好有点时间&#xff0c;利用起来读完。 赏析没有细看&#xff0c;只读了诗词部分&#xff0…

Cocos creator实现《战机长空》关卡本地存储功能

Cocos creator实现《战机长空》关卡本地存储功能 Cocos creator在开放小游戏过程中&#xff0c;经常会出现设置关卡&#xff0c;这里记录一下关卡数据本地存储功能。 一、关卡设置数据 假如我们有关卡数据如下&#xff0c; let settings [ { level: 1, // 第1关 score: 0,…

uniapp的app端推送功能,不使用unipush

1&#xff1a;推送功能使用htmlPlus实现&#xff1a;地址HTML5 API Reference (html5plus.org) 效果图&#xff1a; 代码实现&#xff1a; <template><view class"content"><view class"text-area"><button click"createMsg&q…

Spring框架学习笔记(一):Spring基本介绍(包含IOC容器底层结构)

1 官方资料 1.1 官网 https://spring.io/ 1.2 进入 Spring5 下拉 projects, 进入 Spring Framework 进入 Spring5 的 github 1.3 在maven项目中导入依赖 <dependencies><!--加入spring开发的基本包--><dependency><groupId>org.springframework<…

SpringBoot集成微信支付V3版本流程(商户平台篇)

一、前言 微信支付账号类型分为商户平台和合作伙伴平台&#xff0c;今天主要是梳理商品平台微信支付流程。 商品平台文档地址&#xff0c;(在接入前建议仔细阅读这份文档&#xff0c;会少走很多弯路!!!) 小程序下单 - 小程序支付 | 微信支付商户文档中心 二、接入流程 以下…

qml 和 c++类的数据交互

1、 新建一个需要交互的C++类 1)添加QObject头文件 2)添加自QObject的继承 3)添加Q_OBJECT宏 4)使用Q_PROPERTY,定义两个交互的属性,并设置读写的方法和变更属性的信号。 5)添加方法、槽函数和变量 2、在main.cpp中添加实例化对象的QML上下文 1)添加需要QML交互的…