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;}
}
//lasrErrorvoid 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;}}

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【系统架构师】-案例篇(七)信息安全

某软件公司拟开发一套信息安全支撑平台&#xff0c;为客户的局域网业务环境提供信息安全保护。该支撑平台的主要需求如下&#xff1a; 1.为局域网业务环境提供用户身份鉴别与资源访问授权功能&#xff1b; 2.为局域网环境中交换的网络数据提供加密保护&#xff1b; 3.为服务…

数据驱动实战二

目标 掌握数据驱动的开发流程掌握如何读取JSON数据文件巩固PO模式 1. 案例 对TPshop网站的登录模块进行单元测试 1.1 实现步骤 编写测试用例采用PO模式的分层思想对页面进行封装编写测试脚本定义数据文件&#xff0c;实现参数化 1.2 用例设计 1.3 数据文件 {"login…

LangChain连接国内大模型测试|智谱ai、讯飞星火、通义千问

智谱AI 配置参考 https://python.langchain.com/v0.1/docs/integrations/chat/zhipuai/ZHIPUAI_API_KEY从https://open.bigmodel.cn/获取 from langchain_community.chat_models import ChatZhipuAI from langchain_core.messages import AIMessage, HumanMessage, SystemMes…

【计算机毕业设计】springboot国风彩妆网站

二十一世纪我们的社会进入了信息时代&#xff0c; 信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

最新版在线客服系统源码

源码介绍 首发最新在线客服系统源码&#xff0c;优化更好并且重构源码布局UI 性能不吃cpu并发快,普通1H2G都能带动最新版只要是服务器都能带动 搭建即可使用,操作简单,易懂 修复了老版本bug 内附有搭建教程 gofly.v1kf.com 运行环境 Nginx 1.20 MySQL 5.7 演示截图

如何自动(定时/间隔/重复)执行 同步文件、备份打包加密压缩文件

参考下列两个教程结合使用即可&#xff1a; 快捷自由定时重启、注销、关机 如何从多个文件夹内转移全部文件&#xff08;忽略文件夹的结构&#xff09;&#xff08;进行复制&#xff09;&#xff08;再打包&#xff09; 就是先设定好 勾选对 来源路径’Zip打包&#xff0c;并…

Logstash分析MySQL慢查询日志实践

删除匹配到的行&#xff0c;当前行信息不记录到message中

ICRA 2024 成果介绍:基于 RRT* 的连续体机器人高效轨迹规划方法

近来&#xff0c;连续体机器人研究受到越来越多的关注。其灵活度高&#xff0c;可以调整形状适应动态环境&#xff0c;特别适合于微创手术、工业⽣产以及危险环境探索等应用。 连续体机器人拥有无限自由度&#xff08;DoF&#xff09;&#xff0c;为执行空间探索等任务提供了灵…

STM32学习和实践笔记(25):USART(通用同步、异步收发器)

一&#xff0c;STM32的USART简介 USART即通用同步、异步收发器&#xff0c;它能够灵活地与外部设备进行全双工数据交换&#xff0c;满足外部设备对工业标准 NRZ 异步串行数据格式的要求。 UART即通用异步收发器&#xff0c;它是在USART基础上裁剪掉了同步通信功能。 开发板上…

【C++】转换构造函数和类型转换函数

目录 转换构造函数转换构造函数调用 类型转换函数类型转换函数定义形式应用 转换构造函数 转换构造函数就是一种构造函数&#xff0c;将一个其他类型的数据转换成一个类的对象的构造函数。 类型->类对象 转换构造函数调用 &#xff08;1&#xff09;显式强制类型转换&…

图片无损压缩工具-VIKY

一、前言 Viky v3.4是一款功能强大的图片压缩工具&#xff0c;它能够提供高效的图片无损压缩服务。通过使用独特的压缩算法&#xff0c;该软件在显著减小图片文件大小的同时&#xff0c;还保持了图像的清晰度和色彩饱和度&#xff0c;确保了图像质量的优异表现。 二、软件特点…

QA测试开发工程师面试题满分问答22: (干货)为什么要加锁Lock,举个例子说说

加锁原因 下面代码会有什么问题&#xff1f; import threading import requests from queue import Queuedef make_request(url, params, results_queue):response requests.get(url, paramsparams)result {url: url,params: params,response: response.text}results_queue…