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://xiahunao.cn/news/3030124.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

第十五届蓝桥杯python B组省赛

前言&#xff1a; 这是我第一次参加蓝桥杯&#xff0c;成绩并不理想&#xff0c;我反思了一下午&#xff0c;我的问题主要是知识点学不透&#xff0c;题目做的太少&#xff0c;而且学习的时候少数时间不专心&#xff0c;但是&#xff0c;我能感觉到我的学习能力并不弱&#xf…

用云手机打造海外社媒矩阵

在全球经济一体化的大背景下&#xff0c;中国出海企业及B2B外贸公司正将海外社交媒体营销作为重要的市场拓展策略。为更好地触及不同受众群体&#xff0c;构建跨平台的社媒矩阵已成为企业营销的关键步骤。本文将探讨如何利用云手机技术&#xff0c;高效管理并运营多个海外社交媒…

CSS-页面导航栏实现-每文一言(过有意义的生活,做最好的自己)

&#x1f390;每文一言 过有意义的生活,做最好的自己 目录 &#x1f390;每文一言 &#x1f6d2;盒子模型 &#x1f453;外间距 (margin) &#x1f97c;边框 &#x1f45c;内边距 切换盒子模型计算方案&#xff1a; &#x1f3a2; 浮动布局 浮动特点 &#x1f3c6;导航…

Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件)

前言 Adobe Photoshop 是一款专业强大的图片处理工具&#xff0c;从照片编辑和合成到数字绘画、动画和图形设计&#xff0c;一流的图像处理和图形设计应用程序是几乎每个创意项目的核心所在。利用 Photoshop 在桌面上的强大功能&#xff0c;您可以在灵感来袭时随时随地进行创作…

推荐3个实用的github开源项目

目录&#xff1a; 1、AI生成高清短视频 2、媒体平台爬虫 3、文本转语音项目

C++对象的拷贝构造函数

如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。 拷贝(复制)构造函数:利用同类对象构造一个新的对象 ●1.函数名和类同名 (构造函数) ●2.没有返回值 (构造函数) ●3.第一个参数必…

5.12母亲节营销攻略:TikTok助力出海品牌赢得用户心

母亲节&#xff0c;作为一个全球性的节日&#xff0c;不仅是表达对母亲的感激之情的时刻&#xff0c;也是品牌们展示创意、赢得用户心的黄金机会。2024母亲节将至&#xff0c;如何利用TikTok在母亲节这一特殊时刻进行营销&#xff0c;赢得用户的心&#xff0c;成为出海品牌必须…

Oracle count的优化-避免全表扫描

Oracle count的优化-避免全表扫描 select count(*) from t1; 这句话比较简单&#xff0c;但很有玄机&#xff01;对这句话运行的理解&#xff0c;反映了你对数据库的理解深度&#xff01; 建立实验的大表他t1 SQL> conn scott/tiger 已连接。 SQL> drop table t1 purge…

会话劫持攻击就在我们身边,我们要如何防范

会话劫持攻击&#xff08;Session Hijacking&#xff09;是一种网络攻击方式&#xff0c;攻击者通过某种手段获取到用户的会话标识&#xff08;Session ID&#xff09;&#xff0c;然后使用这个会话标识冒充合法用户进行恶意操作。这种攻击方式允许攻击者以合法用户的身份访问受…

【Linux】Linux——Centos7安装Nginx

不需要安装包 1.安装依赖 #查看 C 环境是否安装gcc -v #查看 zlib 是否安装cat /usr/lib64/pkgconfig/zlib.pc #查看 pcre 是否安装pcre-config --version 2.安装C #安装C yum install gcc-c 3.安装pcre yum install -y pcre pcre-devel 4.安装zlib #安装 yum install -y zlib…

5.11学习记录

20长安杯部分 检材 1 的操作系统版本 CentOS Linux 7.6.1810 (Core) 检材 1 中&#xff0c;操作系统的内核版本是 3.10.0-957.el7.x86_64 检材 1 中磁盘包含一个 LVM 逻辑卷&#xff0c;该 LVM 开始的逻辑区块地址&#xff08;LBA&#xff09;是 2099200 物理卷&#xff…

【go项目01_学习记录10】

操作数据库 1 插入数据2 显示文章2.1 修改 articlesShowHandler() 函数2.2 代码解析 3 编辑文章3.1 添加路由3.2 编辑articlesEditHandler()3.3 新建 edit 模板3.4 代码重构3.5 完善articlesUpdateHandler()3.6 测试更新3.7 封装表单验证 1 插入数据 . . . func articlesStore…

STM32F103学习笔记 | 报错界面及解决方案 | 1.keil5中文注释的横竖(正与斜)问题

文章目录 一、报错界面二、解决方案参考文献 一、报错界面 二、解决方案 打开设置 在打开的设置选项卡中&#xff0c;图中Font显示的是这个软件当前设置的字体&#xff0c;可以看到字体是仿宋&#xff0c;这就是问题出现的原因&#xff0c;将之改成没有的字体就行了。 可以看…

一文了解spring事务特性

推荐工具 objectlog 对于重要的一些数据&#xff0c;我们需要记录一条记录的所有版本变化过程&#xff0c;做到持续追踪&#xff0c;为后续问题追踪提供思路。objectlog工具是一个记录单个对象属性变化的日志工具,工具采用spring切面和mybatis拦截器相关技术编写了api依赖包&a…

【.Net动态Web API】参数模型绑定来源

🚀前言 本文是《.Net Core进阶编程课程》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:通过源码实例来讲解Asp.Net Core进阶知识点,让大家完全掌握每一个知识点。 专栏适用于人群:Web后端开发人员 ———————————————— …

ABB机器人IRB360介绍

随着自动化技术的不断发展&#xff0c;分拣和包装行业的应用也越来越广泛。 工业机器人扮演的角色也随之不断增加&#xff0c;其中ABB机器人的一款产品IRB 360 FlexPicker 在抓取和包装技术方面占有重要的地位。与传统的刚性自动化技术相比较&#xff0c;IRB 360具有高灵活性、…

Navicat Data Modeler Ess for Mac:强大的数据库建模设计软件

Navicat Data Modeler Ess for Mac是一款专为Mac用户设计的数据库建模与设计工具&#xff0c;凭借其强大的功能和直观的界面&#xff0c;帮助用户轻松构建和管理复杂的数据库模型。 Navicat Data Modeler Ess for Mac v3.3.17中文直装版下载 这款软件支持多种数据库系统&#x…

SQL注入(sqli-labs第一关)

sqli-labs第一关 方法一&#xff1a;手工注入 来到第一关&#xff0c;图上说我们需要一个数字的参数 于是我们先手工注入?id1 and 11 跟?id1 and 12发现页面没有报错 每张截图上面页面中有select查询语句&#xff0c;这是我在第一关的源码中加上了echo "$sql ";…

信息技术自主可控的意义,针对国产化替换,服务器虚拟化或比公有云更具优势

我们之前在文章《博通收购VMware后&#xff0c;经销商和用户如何应对&#xff1f;新出路&#xff1a;虚拟化国产替代&#xff0c;融入信创云生态》中提到&#xff1a; 从信创整体发展和政策标准来看&#xff0c;供应商必须满足两个条件&#xff1a;一是融入国产信息技术生态&am…

换新机,统信UOS V20桌面专业版(1070)教你轻松搞定数据迁移丨年度更新

硬件装备升级&#xff0c;数据如何快速迁移&#xff1f; 规模化汰换PC&#xff0c;怎样实现便捷部署&#xff1f; 统信UOS V20桌面专业版&#xff08;1070&#xff09; 带来两大换机神器&#xff01; 整机备份、数据迁移 手把手帮你轻松构建新质生产力工具&#xff01; 一键克…