2024.05.10作业

devtools/2024/9/23 0:59:05/

TCP服务器

头文件

#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_staetbtn_clicked();void newConnection_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_staetbtn_clicked()
{if(ui->staetbtn->text()=="启动"){//获取ui界面上的端口号quint16 port=ui->portedit->text().toInt();//启动服务器if(ser->listen(QHostAddress::Any,port)==true){QMessageBox::information(this,"成功","服务器启动成功");}else{QMessageBox::information(this,"失败","服务器启动失败");}connect(ser,&QTcpServer::newConnection,this,&Widget::newConnection_slot);//按钮文本更改ui->staetbtn->setText("关闭");}else{//关闭服务器ser->close();//更改按钮文本内容ui->staetbtn->setText("启动");}
}
//处理newConnection信号的槽函数
void Widget::newConnection_slot()
{//获取最新连接的客户端套接字,并将QTcpSocket* socket=ser->nextPendingConnection();cliList.append(socket);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){cliList.removeAt(i);}}for(int i=0;i<cliList.length();i++){if(cliList[i]->bytesAvailable()!=0){QByteArray msg= cliList[i]->readAll();//将该消息展示到ui界面ui->msgwidget->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 on_connectbtn_clicked();void connected_slot();void on_sendbtn_clicked();void readyRead_slot();void disconnectes_slot();private:Ui::Widget *ui;QTcpSocket *cli;QString user;};
#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信号连接到自定义的槽函数connect(cli,&QTcpSocket::connected,this,&Widget::connected_slot);//客户端收到服务器消息时会自动发射一个readyRead信号connect(cli,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);//断开信号连接对应的槽函数connect(cli,&QTcpSocket::disconnected,this,&Widget::disconnectes_slot);
}
Widget::~Widget()
{delete ui;
}
//连接服务器按钮对应得到槽函数
void Widget::on_connectbtn_clicked()
{if(ui->connectbtn->text()=="连接服务器"){user=ui->userEdit->text();QString ip=ui->IPEdit->text();quint16 port=ui->portEdit->text().toUInt();cli->connectToHost(ip,port);ui->connectbtn->setText("断开服务器");}else{QString msg=user+"已下线";cli->write(msg.toLocal8Bit());cli->disconnectFromHost();ui->connectbtn->setText("连接服务器");}
}
//connected信号的槽函数的实现
void Widget::connected_slot()
{QMessageBox::information(this,"连接","连接成功");
}
//信息发送按钮对应的槽函数
void Widget::on_sendbtn_clicked()
{//将ui界面上的文本信息获取下来QString msg=user+":"+ ui->lineEdit->text();//将消息发送给服务器cli->write(msg.toLocal8Bit());//清空6行编辑器的内容ui->lineEdit->clear();//将消息放入ui界面中QListWidgetItem *item=new QListWidgetItem(msg);item->setTextAlignment(Qt::AlignRight);ui->msgwidget->addItem(item);
}
//处理readyRead信号对应的槽函数
void Widget::readyRead_slot()
{//将客户端套接字中的消息读取出来QByteArray msg=cli->readAll();//将消息展示到ui界面ui->msgwidget->addItem(QString::fromLocal8Bit(msg));
}
//disconnected信号对应的槽函数
void Widget::disconnectes_slot()
{QMessageBox::information(this,"断开","断开连接");
}

数据库

头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QMessageBox>
#include <QSqlQuery>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();void on_deletebtn_clicked();void on_updataButton_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;}
}Widget::~Widget()
{delete ui;
}
//添加槽函数
void Widget::on_addbtn_clicked()
{int ui_numb=ui->numEdit->text().toUInt();QString ui_name=ui->nameedit->text();QString ui_sex=ui->sexEdit->text();double ui_score=ui->scoreedit->text().toUInt();if(ui_sex==NULL||ui_numb==0||ui_name==NULL||ui_score==0){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,"提示","添加失败");return;}else{QMessageBox::information(this,"提示","添加成功");//清空所有行编辑框ui->numEdit->clear();ui->nameedit->clear();ui->sexEdit->clear();ui->scoreedit->clear();return;}}//查找槽函数
void Widget::on_searchbtn_clicked()
{ui->tableWidget->clearContents();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::information(this,"提示","查找失败");return;}//清空所有行编辑框ui->numEdit->clear();ui->nameedit->clear();ui->sexEdit->clear();ui->scoreedit->clear();int i=0;while(query.next()){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++;}
}
//删除槽函数
void Widget::on_deletebtn_clicked()
{QString sql;if(ui->nameedit->text()==NULL){sql="delete from Stu";}else{sql=QString("delete from Stu where name='%1'").arg(ui->nameedit->text());}QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","删除失败");return;}else{QMessageBox::information(this,"提示","删除成功");//清空所有行编辑框ui->numEdit->clear();ui->nameedit->clear();ui->sexEdit->clear();ui->scoreedit->clear();}
}
//修改槽函数
void Widget::on_updataButton_clicked()
{QString sql;sql=QString("update Stu set score=%1 where name='%2'").arg(ui->scoreedit->text()).arg(ui->nameedit->text());QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","修改失败");return;}else{QMessageBox::information(this,"提示","修改成功");//清空所有行编辑框ui->numEdit->clear();ui->nameedit->clear();ui->sexEdit->clear();ui->scoreedit->clear();}
}


http://www.ppmy.cn/devtools/40021.html

相关文章

光通信行业专业术语解析大全

近期公司内部开展了一期学习交流会&#xff0c;各位同事收获颇多&#xff0c;特别是关于一些专业术语的简称&#xff0c;大家都觉得非常有意思&#xff01;小编马不停蹄的整理出来分享给大家&#xff0c;希望可以给学习光通信知识的萌新们小小助力&#xff01; 以下是光通信行…

【excel】统计单元格内数字/字符串的数量

文章目录 一、问题二、步骤&#xff08;一&#xff09;将A1中的数字分解出来&#xff0c;在不同的单元格中显示&#xff08;二&#xff09;统计每个数字出现的个数&#xff08;三&#xff09;去重 三、尾巴 一、问题 单元格中有如下数值&#xff1a;12345234534545&#xff0c…

(Java)心得:LeetCode——11.盛最多水的容器

一、原题 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

Vivado功耗之散热模型详解

目录 一、前言 二、热模型 三、结温计算 四、散热器计算 五、参考资料 一、前言 ​在功耗评估中&#xff0c;Vivado中report power流程以及XPE中都有关于environment的配置&#xff0c;该界面配置涉及到多个晦涩的概念&#xff0c;之前的文章中也对相关概念进行过翻译&…

数据结构复习指导之二叉树的概念

文章目录 二叉树 考纲内容 复习提示 1.二叉树的概念 1.1二叉树的定义及其主要特性 1.1.1二叉树的定义 1.1.2几种特殊的二叉树 1.1.3二叉树的性质 1.2二叉树的存储结构 1.2.1顺序存储结构 1.2.2链式存储结构 知识回顾 二叉树 考纲内容 &#xff08;一&#xff09;树…

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如一个场景…

SpringAMQP Work Queue 工作队列

消息模型: 代码模拟: 相较于之前的基础队列&#xff0c;该队列新增了消费者 不再是一个&#xff0c;所以我们通过代码模拟出两个consumer消费者。在原来的消费者类里写两个方法 其中消费者1效率高 消费者2效率低 RabbitListener(queues "simple.queue")public voi…

GT2512-STBA 三菱触摸屏12.1寸型

T2512-STBA参数说明&#xff1a;12.1"、SVGA 800*600、65536色、TFT彩色液晶显示屏、AC电源、32MB内存 三菱触摸屏GT2512-STBA性能规格详细说明&#xff1a; [显示部] 显示软元件&#xff1a;TFT彩色液晶显示屏 画面尺寸&#xff1a;12.1寸 分辨率&#xff1a;SVGA 80…