QT作业5

1、聊天室

服务器端

//头文件
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
#include <QListWidget>
#include <QMessageBox>
#include <QDebug>
#include <QLineEdit>
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTQListWidget *wid;QLineEdit *Edit;QPushButton *Btn;public:Widget(QWidget *parent = nullptr);~Widget();
private slots:void on_clicked();void newConnect_slot();void readyRead_slot();private:Ui::Widget *ui;QTcpServer *ser;QList<QTcpSocket*> cliList;
};
#endif // WIDGET_H//源文件
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->wid=new QListWidget(this);wid->resize(800,500);wid->setFixedSize(760,400);wid->move(20,20);this->Edit=new QLineEdit(this);Edit->resize(500,50);Edit->move(20,440);this->Btn=new QPushButton("启动",this);Btn->resize(200,50);Btn->move(580,440);ser=new QTcpServer(this);QObject::connect(Btn,&QPushButton::clicked,this,&Widget::on_clicked);
}Widget::~Widget()
{delete ui;
}void Widget::on_clicked()
{if(this->Btn->text()=="启动"){quint16 port=this->Edit->text().toUInt();if(ser->listen(QHostAddress::Any, port) == true){QMessageBox::information(this, "成功", "服务器启动成功");}else{QMessageBox::information(this, "失败", "服务器启动失败");}connect(ser, &QTcpServer::newConnection, this, &Widget::newConnect_slot);//将文本内容更改成 关闭this->Btn->setText("关闭");}else{//关闭服务器ser->close();        //关闭监听//将文件内容更改成 启动this->Btn->setText("启动");}
}
void Widget::newConnect_slot()
{qDebug () <<"有新客户端发来连接请求了,请尽快处理";//获取最新连接的客户端套接字,并将最新连接的套接字地址返回QTcpSocket* socket = ser->nextPendingConnection();//将该客户端套接字放入到客户端容器中cliList.append(socket);//当有客户端向服务器发来数据时,当前这个客户端套接字就会自动发射一个readyRead信号//我们可以将该信号连接到对应的信号处理函数中,处理相关数据connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);}
void Widget::readyRead_slot()
{//判断客户端容器中,是否有已经退出的客户端,或无效的客户端,如果有,将其进行移除for(int i=0; i<cliList.length(); i++){if(cliList[i]->state() == QTcpSocket::UnconnectedState){//功能:判断当前套接字的状态//参数:无//返回值:readyRead_slot表示无效的套接字cliList.removeAt(i);           //将下标为i的客户端套接字从容器中移除}}//再将客户端容器遍历一遍,判断哪个客户端中有数据待读for(int i=0; i<cliList.length(); i++){if(cliList[i]->bytesAvailable() != 0){//功能:获取当前套接字中待读数据的个数//参数:无//返回值:返回套接字中待读数据的个数,如果为0,表示没有数据可读//如果不等于0,表示有数据可读,可以使用readAll读取数据QByteArray msg = cliList[i]->readAll();//将该消息,展示到ui界面上this->wid->addItem(QString::fromLocal8Bit(msg));//将该消息转发给所有客户端for(int j=0; j<cliList.length(); j++){if(i!=j)       {cliList[j]->write(msg);}}}}
}

客户端

头文件:
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void connnected_slot();void readyRead_slot();void disconnectes_slot();void on_pushButton_clicked();void on_connectBtn_clicked();private:Ui::Widget *ui;QTcpSocket *cli;QString userName;
};
#endif // WIDGET_H源文件:
#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::connnected_slot);connect(cli,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);connect(cli,&QTcpSocket::disconnected,this,&Widget::disconnectes_slot);
}Widget::~Widget()
{delete ui;
}void Widget::connnected_slot()
{QMessageBox::information(this,"连接","连接成功!");
}void Widget::readyRead_slot()
{//将客户端套接字中的消息读取出来QByteArray msg=cli->readAll();ui->listWidget->addItem(msg);
}
void Widget::disconnectes_slot()
{QMessageBox::information(this,"断开","断开服务器");
}void Widget::on_pushButton_clicked()
{QString msg=ui->lineEdit->text();cli->write(msg.toLocal8Bit());ui->lineEdit->clear();QListWidgetItem *item=new QListWidgetItem(msg);item->setTextAlignment(Qt::AlignRight);ui->listWidget->addItem(item);
}void Widget::on_connectBtn_clicked()
{if(ui->connectBtn->text()=="连接服务器"){userName = ui->userNameEdit->text();QString ip=ui->ipEdit->text();quint16 port =ui->portEdit->text().toUInt();cli->connectToHost(ip,port);ui->connectBtn->setText("断开服务器");}else {cli->disconnectFromHost();ui->connectBtn->setText("连接服务器");}
}

2、完善数据库管理系统

头文件:
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QMessageBox>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_addBtn_clicked();void on_searchBtn_clicked();private:Ui::Widget *ui;QSqlDatabase db;
};
#endif // WIDGET_H源文件
#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 double)";QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","创建数据表失败");return;} else{QMessageBox::information(this,"提示","创建数据表成功");return;}
}Widget::~Widget()
{delete ui;
}void Widget::on_addBtn_clicked()
{int ui_numb=ui->numbEdit->text().toUInt();QString ui_name=ui->nameEdit->text();QString ui_sex=ui->sexEdit->text();double ui_score=ui->scoreEdit->text().toDouble();if(ui_sex==NULL||ui_numb==0||ui_score==0||ui_name==NULL){QMessageBox::information(this,"提示","请将信息填写完整");return;}else{}//准备sql语句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,"提示","创建数据表失败");return;}else{QMessageBox::information(this,"提示","创建数据表成功");return;}
}
//查找按钮对应的槽函数
void Widget::on_searchBtn_clicked()
{QString sql;if(ui->nameEdit->text()==NULL){sql="select * from Stu";}else{sql=QString("select %1 from Stu").arg(ui->nameEdit->text());}QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","查询失败");return;}int i=0;while(query.next()){//qDebug()<<query.record();for(int j=0;j<query.record().count();j++){QTableWidgetItem *item=new QTableWidgetItem(query.record().value(j).toString());item->setTextAlignment(Qt::AlignCenter);ui->tableWidget->setItem(i,j,item);}i++;}
}

3、思维导图

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

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

相关文章

渗透之sql注入----二次注入

目录 二次注入的原理&#xff1a; 实战&#xff1a; 第一步&#xff1a;找注入点 找漏洞&#xff1a; 注入大概过程&#xff1a; 第二步&#xff1a;开始注入 二次注入的原理&#xff1a; 二次注入是由于对用户输入的数据过滤不严谨&#xff0c;导致存在异常的数据被出入…

通俗的理解网关的概念的用途(三):你的数据包是如何到达下一层的

其实&#xff0c;这一章我写不好&#xff0c;因为这其中会涉及到一些计算和一些广播等概念&#xff0c;本人不善于此项。在此略述&#xff0c;可以参考。 每台设备的不同连接在获得有效的IP地址后&#xff0c;会根据IP地址的规则和掩码的规则&#xff0c;在操作系统和交换机&a…

暴力数据结构之栈与队列(队列详解)

1.队列的定义 队列是一种特殊的线性表&#xff0c;它遵循先进先出&#xff08;FIFO&#xff09;的原则。在队列中&#xff0c;只允许在表的一端进行插入操作&#xff08;队尾&#xff09;&#xff0c;而在另一端进行删除操作&#xff08;队头&#xff09;。这种数据结构确保了最…

基于Springboot的微乐校园管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的微乐校园管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

Java设计模式 _结构型模式_外观模式

一、外观模式 1、外观模式 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型模式。主要特点为隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这有助于降低系统的复杂性&#xff0c;提高可维护性。当客户端与多个子系统之间存在大量…

【MQTT】mosquitto 的 “下载、交叉编译、使用” 详细教程,手把手搭建一个MQTT Broker

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

传统企业如何实现数字化转型?

随着信息技术的迅猛发展和互联网的普及&#xff0c;数字化转型已经成为企业和组织不可忽视的趋势&#xff0c;数字化转型对企业和组织来说是必要的&#xff0c;它可以提升竞争力&#xff0c;推动创新发展&#xff0c;实现数据驱动决策&#xff0c;提升用户体验并适应未来发展。…

中北大学软件学院javaweb实验二JSP应用开发实验报告

实验时间 2024年4月 25 日17时至 22 时 学时数 4 1.实验名称 实验2&#xff1a;JSP应用开发(2学时) 2.实验目的 &#xff08;1&#xff09;学会编写和运行简单的JSP页面&#xff0c;理解其运行原理&#xff1b; &#xff08;2&#xff09;学会使用JSP的声明、表达式、脚…

Rust 适合哪些场景?

目录 二、Rust 适合哪些场景&#xff1f; 三、Rust 社区的发展趋势如何&#xff1f; 四、Rust 快速搭建一个WebServer服务器 一、Rust是什么&#xff1f; Rust是一门赋予每个人构建可靠且高效软件能力的语言。 Rust 程序设计语言 一门帮助每个人构建可靠且高效软件的语言。…

Python写了for i in range(10)却只打印一遍?

题目&#xff1a;定义一个两个参数的重复打印函数&#xff0c;第一个参数指定要打印的字符串&#xff0c;第二个参数指定要重复打印的次数&#xff0c;在主程序中调用该函数&#xff0c;打印10遍你的学号姓名。 为什么调用函数后结果只打印了一遍? 看了题目感觉就很诡异&#…

爬虫-无限debug场景 解决方式

解决无限debug 场景1 1. 鼠标右键 选择 continue to here&#xff08;此处不停留&#xff09;2. 鼠标右键 选择 edite breakpoint 设置 10 保证条件不成立 这行永远不执行3.方法置空 1. 方法调用加断点2. 控制台 setInterval function name() {}4. 替换文件 5. hoo…

Apache SeaTunnel 正式发布2.3.5版本,功能增强及多个Bug修复

经过两个月的筹备&#xff0c;我们在2.3.4版本基础上进行了新一轮的迭代&#xff0c;本次更新不仅修复了多个关键问题&#xff0c;还引入了若干重要功能增强和性能优化。 在此&#xff0c;我们先提前感谢社区成员的贡献和支持&#xff0c;如果你想升级最新的版本&#xff0c;快…

websocket最大数量的限制问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

安全 | 开源入侵防御系统 Snort

目录 Snort 概要 入侵预防系统模式 数据包记录器和嗅探器模式 网络安全学习路线 &#xff08;2024最新整理&#xff09; 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; Snort 概要 Snort 概要 是世界上最重要的开源入…

《十日终焉》中的定律整理-向虫队学习(举例+持续更新)

1、二八定律 二八定律&#xff0c;又称帕累托法则&#xff0c;也叫巴莱多定律。 是19世纪末20世纪初意大利经济学家巴莱多发明的。其中指出&#xff0c;约仅有20%的因素影响80%的结果。也就是说&#xff1a;所有变因中&#xff0c;最重要的仅有20%&#xff0c;虽然剩余的80%占…

实习体验报告怎么写:AI产品助理实习经历

笔灵实习体验报告模版免费分享&#xff0c;更多需要可以点击使用⬇️ https://ibiling.cn/scene/inex?fromcsdnsx 一、实习背景与目的在过去的几个月里&#xff0c;我有幸在一家知名科技公司实习&#xff0c;担任AI产品助理的角色。这次实习让我有机会深入了解AI领域&#x…

JAVA 双亲委派之一

JAVA 双亲委派之一 JVM类加载流程 java语言系统内置了众多类加载器&#xff0c;从一定程度上讲&#xff0c;只存在两种不同的类加载器&#xff1a;一种是启动类加载器&#xff0c;此类加载由C实现&#xff0c;是JVM的一部分&#xff1b;另一种就是所有其他的类加载器&#xf…

ASP.NET学生成绩管理系统

摘要 本系统依据开发要求主要应用于教育系统&#xff0c;完成对日常的教育工作中学生成绩档案的数字化管理。开发本系统可使学院教职员工减轻工作压力&#xff0c;比较系统地对教务、教学上的各项服务和信息进行管理&#xff0c;同时&#xff0c;可以减少劳动力的使用&#xf…

【网络】gateway 可以提供的一些功能之三 “ 支持Eureka服务发现 ”

一、Eureka是干什么的 Eureka就像是一个电话簿&#xff0c;但是用来存储和管理各种微服务的地址信息。它帮助微服务之间相互发现和交流&#xff0c;就像你想找某人电话号码一样&#xff0c;只需查看电话簿就能找到他们的联系方式。Eureka也可以帮助系统在服务出现问题时自动发现…

STM32CubeMX软件使用(超详细)

1、Cube启动页介绍 2、芯片选择页面介绍 3、输入自己的芯片型号&#xff0c;这里以STM32U575RIT6举例 4、芯片配置页码介绍 5、芯片外设配置栏详细说明 6、点击ClockConfiguration进行时钟树的配置&#xff0c;选择时钟树后可以选择自己想使用的时钟源&#xff0c;也可以直接输…