QT day5 作业

2024-05-10 20:36
文章标签 qt 作业 day5

本文主要是介绍QT day5 作业,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

服务器头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>   //服务器类
#include <QTcpSocket>   //客户端类
#include <QList>        //链表类
#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_start_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);//给服务器指针实例化对象ser = new QTcpServer(this);
}Widget::~Widget()
{delete ui;
}//启动按钮对应的槽函数
void Widget::on_start_clicked()
{if(ui->start->text() == "启动"){//获取ui界面上的端口号quint16 port = ui->port->text().toUInt();//启动服务器//将服务器设置为被动监听状态if(ser->listen(QHostAddress::Any,port) == true){QMessageBox::information(this,"成功","服务器启动成功");}else{QMessageBox::information(this,"成功","服务器启动失败");}//当启动服务器后,如果有客户端发来的连接请求,那么服务器就会自动发射一个newConnect信号//我们可以将该信号,连接到对应的槽函数中处理相关逻辑connect(ser,&QTcpServer::newConnection,this,&Widget::newConnect_slot);//将文本内容改成关闭ui->start->setText("关闭");}else{//关闭服务器ser->close();//将文本内容改成启动ui->start->setText("启动");}
}//处理newConnection信号的槽函数实现
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++){//功能:获取当前套接字中待读取数据的个数//参数:无//返回值:返回套接字中待读取数据的个数,如果为0,表示没有数据可读//如果不等于0,表示有数据可读,可以使用readAll读取数据QByteArray msg = cliList[i]->readAll();//将该信息,展示到ui界面上ui->msg->addItem(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 on_connectBtn_clicked();void connected_slot();void on_sendBtn_clicked();void readyRead_slot();void disconnectes_slot();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);//将客户端的connected信号连接到自定义的槽函数中connect(cli,&QTcpSocket::connected,this,&Widget::connected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{if(ui->connectBtn->text() == "连接服务器"){//执行连接服务器的工作//获取ui界面上的数据username = ui->userEdit->text();QString ip = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUInt();//向服务器发送连接请求cli->connectToHost(ip,port);//功能:向指定的服务器发送连接请求//参数1:服务器ip地址//参数2:服务器端口号//当成功连接到服务器后,当前客户端会自动发射一个connected信号,我们可以将该信号连接到服务器//由于该操作只需进行一次即可,所以写在构造函数中即可//将按钮内容更改为断开服务器ui->connectBtn->setText("断开服务器");}else{//执行断开服务器工作//将按钮内容更改成连接服务器ui->connectBtn->setText("连接服务器");}
}//自定义处理connected信号的槽函数的实现
void Widget::connected_slot()
{QMessageBox::information(this,"连接","连接服务器成功");
}//信息发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{//将ui界面上的文本信息获取下来QString msg = username + ":" + ui->msgEdit->text();//将该消息发送给服务器cli->write(msg.toLocal8Bit());//清空行编辑器中的内容ui->msgEdit->clear();//将消息放入ui界面中QListWidgetItem *item = new QListWidgetItem(msg);item->setTextAlignment(Qt::AlignRight);ui->listWidget->addItem(item);
}//处理readyRead信号对应的槽函数的实现
void Widget::readyRead_slot()
{//将客户端套接字中的消息读取出来QByteArray msg = cli->readAll();//将该消息展示到ui界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}//disconnected信号对应的槽函数
void Widget::disconnectes_slot()
{QMessageBox::information(this,"断开","断开服务器成功");
}

sql头文件

#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

sql源文件

#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");  //表示使用的是sqlite3数据库//给数据库设置名字db.setDatabaseName("mydb.db");}//此时已经创建了该数据库但是还没有打开if(!db.open()){QMessageBox::information(this,"失败","数据库打开失败");return;}//程序执行至此,说明数据库打开成功//准备sql语句QString sql = "create table if not exists Stu(name char,numb int,sex char,score double)";//实例化一个sql语句的执行者QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","创建数据表失败");return;}
}Widget::~Widget()
{delete ui;
}//添加学员信息按钮对应的槽函数
void Widget::on_addBtn_clicked()
{//将ui界面上的相关信息获取下来QString ui_name = ui->nameEdit->text();int ui_number = ui->numberEdit->text().toUInt();QString ui_sex = ui->sexEdit->text();double ui_score = ui->scoreEdit->text().toDouble();//判断是否有空的没有填写的数据if(ui_name == NULL || ui_number == 0 || ui_sex == NULL || ui_score == 0){QMessageBox::information(this,"提示","有内容没有填写");return;}//准备sql语句QString sql = QString("insert into Stu values('%1',%2,'%3',%4)").arg(ui_name).arg(ui_number).arg(ui_sex).arg(ui_score);//实例化一个sql语句的执行者QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","添加数据失败");return;}else{QMessageBox::information(this,"提示","添加数据成功");return;}
}//查找按钮对应的槽函数
void Widget::on_searchBtn_clicked()
{QString sql;//准备sql语句if(ui->nameEdit->text() == NULL){sql = "select * from Stu";}else{sql = QString("select '%1' from Stu").arg(ui->nameEdit->text());}//执行sql语句//实例化一个sql语句的执行者QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","查询数据失败");return;}//将查询结果展示到ui界面上int i = 0;while(query.next()){//这里面是一个任意的查询结果,query对象中保存的是当前的一个记录//可以通过成员函数:QSqlRecord QSqlQuery::record() const//通过QSqlRecord类的成员函数:count,来获取当前记录中的列数//通过调用QSqlRecord类的成员函数:value(i),来获取下标为i列的那一项的数据值for(int j = 0;j < query.record().count();j++){qDebug() << query.record().value(j).toString();//将数据库中的数据,依次存放到ui界面中ui->tableWidget->setItem(i, j, new QTableWidgetItem(query.record().value(j).toString()));}i++;}
}

思维导图

这篇关于QT day5 作业的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977490

相关文章

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言