2.26 Qt day4+5 纯净窗口移动+绘画事件+Qt实现TCP连接服务+Qt实现连接数据库

思维导图

Qt实现TCP连接

服务器端:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTcpServer>//服务器端类
#include<QTcpSocket>//客户端类
#include<QMessageBox>//消息对话框类
#include<QList>//链表容器类--->存放客户端的容器QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void newconnection_slot();//newconnect对应的槽函数声明void readyRead_slot();//readyRead对应的槽函数声明
private slots:void on_startBtn_clicked();private:Ui::Widget *ui;QTcpServer *server;//实例化一个服务器指针QList<QTcpSocket *>socketList;//定义一个容器存放客户端
};
#endif // WIDGET_H

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给服务器指针实例化空间server=new QTcpServer(this);
}Widget::~Widget()
{delete ui;
}
//newconnection信号对应的槽函数实现
void Widget::newconnection_slot()
{//获取最新连接的客户端的套接字QTcpSocket *s=server->nextPendingConnection();//将客户端套接字存放到容器列表中socketList.push_back(s);//将readyRead信号连接到自定义的槽函数中connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//readyRead对应的槽函数实现
void Widget::readyRead_slot()
{//读取客户端的数据//移除无效客户端for(int i=0;i<socketList.count();i++){//判断客户端与服务器的连接状态 未连接UnconnectedState枚举值:0if(socketList.at(i)->state()==QTcpSocket::UnconnectedState)//==0也可{socketList.removeAt(i);//通过下标删除该元素}}//遍历有效客户端中哪些客户端有数据带读for(int i=0;i<socketList.count();i++){//判断套接字中有没有数据if(socketList.at(i)->bytesAvailable()!=0){//读取客户端中的数据QByteArray msg=socketList.at(i)->readAll();//将读取到的信息放入ui界面上ui->msgWidget->addItem(QString::fromLocal8Bit(msg));//addItem==setText//将该数据内容广播给所有人for(int j=0;j<socketList.count();j++){//将数据写入所有客户端的套接字中socketList.at(j)->write(msg);}}}
}//启动按钮对应的槽函数处理
void Widget::on_startBtn_clicked()
{//获取UI界面的端口号 toUInt将字符串转换成整型quint16 port=ui->portEdit->text().toUInt();//设置监听if(server->listen(QHostAddress::Any,port)){//弹出消息对话框QMessageBox::information(this,"","启动服务器成功!");//设置启动按钮不可用ui->startBtn->setEnabled(false);}else{QMessageBox::information(this,"","启动服务器失败!");return;}//将客户端发来的newConnection信号连接到自定义的槽函数connect(server,&QTcpServer::newConnection,this,&Widget::newconnection_slot);
}

widget.ui

客户端:

widget.h

#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 on_sendBtn_clicked();void on_disconnectBtn_clicked();public slots:void connected_slot();//connected对应的槽函数声明void readyRead_slot();//readyRead对应的槽函数声明void disconnect_slot();//disconnected对应的槽函数声明private:Ui::Widget *ui;//实例化一个客户端指针QTcpSocket *socket;QString userName;//存放用户名
};
#endif // WIDGET_H

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给客户端指针申请空间socket=new QTcpSocket(this);//设置初始化界面 给msgEdit、sendEdit、disconnectBtn设置不可用ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);//将connected信号连接到自定义的槽函数connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
}Widget::~Widget()
{delete ui;
}//连接按钮对应的槽函数处理
void Widget::on_connectBtn_clicked()
{//获取UI界面上的IP和端口号QString ip=ui->IPEdit->text();quint16 port=ui->portEdit->text().toUInt();//将字符串转换为整型//连接服务器socket->connectToHost(ip,port);//将readyRead信号和自定义槽函数连接connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//connected对应的槽函数实现
void Widget::connected_slot()
{//弹出消息对话框 提示用户连接成功QMessageBox::information(this,"","连接服务器成功!");//将msgEdit、sendEdit、disconnectBtn设置可用ui->msgEdit->setEnabled(true);ui->sendBtn->setEnabled(true);ui->disconnectBtn->setEnabled(true);//将connectBtn、userNameEdit、IPEdit、portEdit设置不可用ui->connectBtn->setEnabled(false);ui->userNameEdit->setEnabled(false);ui->IPEdit->setEnabled(false);ui->portEdit->setEnabled(false);//告诉服务器xxx上线了userName=ui->userNameEdit->text();QString msg=userName+":进入聊天室!";//将msg发送给服务器socket->write(msg.toLocal8Bit());
}
//readyRead对应的槽函数实现
void Widget::readyRead_slot()
{//读取数据QByteArray msg=socket->readAll();//将读取的数据放入ui界面上ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}
//disconnect对应的槽函数
void Widget::disconnect_slot()
{//将客户端与服务器端断开连接socket->disconnectFromHost();
}
//发送按钮对应的槽函数处理
void Widget::on_sendBtn_clicked()
{//将msgEdit文本发送给服务器QString msg=userName+":"+ui->msgEdit->text();socket->write(msg.toLocal8Bit());ui->msgEdit->clear();//清空msgEdit
}
//disconnectBtn按钮对应的槽函数处理
void Widget::on_disconnectBtn_clicked()
{//告诉服务器xxx下线了QString msg=userName+":离开聊天室";socket->write(msg.toLocal8Bit());//将msgEdit、sendEdit、disconnectBtn设置不可用ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);//将connectBtn、userNameEdit、IPEdit、portEdit设置可用ui->connectBtn->setEnabled(true);ui->userNameEdit->setEnabled(true);ui->IPEdit->setEnabled(true);ui->portEdit->setEnabled(true);QMessageBox::information(this,"","断开连接成功!");
}

widget.ui

运行结果:

服务器端初始状态:

 填写端口号启动服务器之后:

 客户端初始状态:

 输入用户名、IP地址、端口号、点击连接之后:

 客户端发送消息给服务器端:

客户端断开连接之后:

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

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

相关文章

亿道丨三防平板丨手持平板丨加固平板丨助力地震救援

自土耳其发生7.8级大地震以来&#xff0c;一直都牵动着世人的心。2023年2月10日&#xff0c;据法新社最新消息&#xff0c;强震已造成土耳其和叙利亚两国超2万人遇难。报道称&#xff0c;相关官员和医护人员表示&#xff0c;地震造成土耳其17674人死亡&#xff0c;叙利亚则有33…

Nginx+Tomcat实现动静分离

文章目录 一.动静分离的原理及架构1.1 动静分离是什么&#xff1f;1.2 动静分离的原理1.3 动静分离的架构组成 二.NginxTomcat实现动静分离2.1实验环境2.2所需软件环境2.3nginx服务的实现2.4配置动静分离 一.动静分离的原理及架构 1.1 动静分离是什么&#xff1f; 动静分离(S…

Nginx的核心配置指令及调优

目录 Nginx 核心配置指令 一、Nginx配置文件详解 1、配置文件目录 2、配置文件结构 二、调优 1、在全局域进行的调优 1.1线程池指令 1.2 工作进程数指令 1.3工作进程优先级指令 1.4 工作进程 CPU 绑定指令 1.5 调试可打开的文件个数 1.6 调试文件大小指令 1.7 只运…

FL Studio Fruity Edition2024中文入门版Win/Mac

FL Studio Fruity Edition2024是一款功能强大的音乐制作软件&#xff0c;适合初学者和音乐爱好者使用。它提供了丰富的音乐制作工具&#xff0c;包括音频录制、编辑、混音以及MIDI制作等功能&#xff0c;帮助用户轻松创作出动人的音乐作品。 FL Studio 21.2.3 Win-安装包下载如…

《数据治理简易速速上手小册》第1章 数据治理概述(2024 最新版)

文章目录 1.1 数据治理的定义与重要性1.1.1 基础知识1.1.2 重点案例&#xff1a;客户数据分析1.1.3 拓展案例 1&#xff1a;库存管理系统1.1.4 拓展案例 2&#xff1a;合规性数据报告 1.2 数据治理的发展历程1.2.1 基础知识1.2.2 重点案例&#xff1a;电商平台的用户数据管理1.…

苍穹外卖 -- day10- Spring Task- 订单状态定时处理- WebSocket- 来单提醒- 客户催单

苍穹外卖-day10 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代…

稀疏表示分类(Sparse Representation for Classification,SRC)

稀疏表示分类&#xff08;Sparse Representation for Classification&#xff0c;简称SRC&#xff09;是一项在模式识别和信号处理中应用广泛的技术。它基于这样一个概念&#xff1a;一个信号&#xff08;比如图像、语音等&#xff09;可以用一个较大的字典中的一些基向量稀疏地…

SpringCache缓存专题

SpringCache缓存专题 学习目标 1、理解缓存存在的意义 2、掌握redis与SpringCache的集成方式 3、掌握SpringCache注解的使用 4、掌握项目集成SpringCache流程 第一章 基于SpringCache缓存方案 1.为什么需要缓存 ​ 前台请求&#xff0c;后台先从缓存中取数据&#xff0…

浅析ARMv8体系结构:原子操作

文章目录 概述LL/SC机制独占内存访问指令多字节独占内存访问指令 独占监视器经典自旋锁实现 LSE机制原子内存操作指令CAS指令交换指令 相关参考 概述 在编程中&#xff0c;当多个处理器或线程访问共享数据&#xff0c;并且至少有一个正在写入时&#xff0c;操作必须是原子的&a…

uniapp的微信小程序授权头像昵称(最新版)

前面我出过两期博客关于小程序授权登录,利用php实现一个简单的小程序授权登录并存储授权用户信息到数据库的完整流程。无奈&#xff0c;小程序官方又整幺蛾子了。wx.getUserInfo接口收回&#xff0c;wx.getUserProfile接口也不让用。导致我的个人小程序&#xff1a;梦缘 的授权…

Linux设备模型(五) - uevent kernel实现

1. Uevent的功能 Uevent是Kobject的一部分&#xff0c;用于在Kobject状态发生改变时&#xff0c;例如增加、移除等&#xff0c;通知用户空间程序。用户空间程序收到这样的事件后&#xff0c;会做相应的处理。 该机制通常是用来支持热拔插设备的&#xff0c;例如U盘插入后&…

APIFox-自动获取登录状态操作

APIFox-自动获取登录状态操作 概述 作为纯后端开发码农&#xff0c;每次接口开发完的调试很重要&#xff0c;因此每次重复的手动获取登陆状态Token或者直接放行就太麻烦了。 APIFox提供了前置操作&#xff0c;可以很方便的自动获取登录状态&#xff0c;节省大量重复劳动时间。…

《TCP/IP详解 卷一》第7章 防火墙和NAT

7.1 引言 NAT通常改变源IP和源端口&#xff0c;不改变目的IP和目的端口。 7.2 防火墙 常用防火墙&#xff1a; 包过滤防火墙&#xff08;packet-filter firewall&#xff09; 代理防火墙&#xff08;proxy firewall&#xff09; 代理防火墙作用&#xff1a; 1. 通过代理服务…

React_使用es5和es6语法渲染和添加class

React入门 //react的核心库 <script src"https://cdn.jsdelivr.net/npm/react17/umd/react.development.js"></script> //react操作dom的核心库&#xff0c;类似于jquery <script src"https://cdn.jsdelivr.net/npm/react-dom17/umd/react-dom.…

kuka协作机器人LBR系列 issy15R930导入到ros2_rviz(带外观文件)

kuka协作机器人LBR系列 issy15R930导入到ros2_rviz(带外观文件&#xff09;外观文件未调整好&#xff0c;外观仍需进一步研究&#xff0c;外观文件dae与轮廓&#xff08;碰撞&#xff09;文件STL并未完全对应起来。在blender里面看了一下UR机器人的文件&#xff0c;是对应的&am…

【博士每天一篇文献-综述】A Modified Echo State Network Model Using Non-Random Topology

阅读时间&#xff1a;2023-11-23 1 介绍 年份&#xff1a;2023 作者&#xff1a; Arroyo, Diana Carolina Roca&#xff0c;数学与计算机科学研究所&#xff08;ICMC&#xff09;圣保罗大学 (USP) 期刊&#xff1a; 博士论文 引用量&#xff1a;0 这篇论文是一篇博士论文&am…

主从复制实现Redis集群

主从复制实现Redis集群实验 (一主二从): 实验环境: 使用Docker 搭建 Redis 版本 5.0.5 打开一个终端窗口&#xff0c;在其中运行如下命令创建一个名为redis-master的Redis容器。注意&#xff0c;它的端口是6379 (本地的端口:映射到容器的端口) docker run -itd--name redis-m…

能碳双控| AIRIOT智慧能碳管理解决方案

在当前全球气候变化和可持续发展的背景下&#xff0c;建设能碳管理平台成为组织迎接挑战、提升可持续性的重要一环&#xff0c;有助于组织实现可持续发展目标&#xff0c;提高社会责任形象&#xff0c;同时适应未来碳排放管理的挑战。能碳管理是一个涉及跟踪、报告和减少组织碳…

【51单片机】红外遥控红外遥控电机调速(江科大)

1.红外遥控简介 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行解调输出 通信方式:单工,异步 红外LED波长:940nm 通信协议标准:NEC标准 2.硬件电路 红外发送部分 IN高电平时&#xff0c;LED不亮&#xff0c;IN低电平时&…