7.28
1.思维导图
2.qt的sever
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTcpServer> //服务器类
#include<QTcpSocket> //客户端类
#include<QMessageBox> //对话框类
#include<QList> //链表容器
#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_startBtn_clicked();void newConnection_slot(); //自定义处理newConnection信号的槽函数void readyRead_slot(); //自定义处理readyRead信号的槽函数private:Ui::Widget *ui;//定义服务器指针QTcpServer *server;//定义客户端容器QList<QTcpSocket*> socketList;
};
#endif // WIDGET_H
#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;
}//启动服务器按钮对应的槽函数
void Widget::on_startBtn_clicked()
{//获取ui界面上的端口号quint16 port = ui->portEdit->text().toUInt();//将服务器设置成监听状态//函数原型: bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);//功能:监听客户端发来的连接请求//参数1:要监听的主机地址,any表示监听任意主机地址,也可以给定特定主机地址//参数2:提供的端口号,如果是0,表示让系统自动分配端口号//返回值:bool,成功监听返回true,失败返回falseif(server->listen(QHostAddress::Any, port)){QMessageBox::information(this,"", "服务器启动成功");}else{QMessageBox::information(this,"", "服务器启动失败");}//此时服务器已经进入监听状态,如果有客户端发来连接请求,那么该服务器就会自动发射一个newConnection信号//我们可以将该信号连接到自定义的槽函数中处理新连接的套接字connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);
}//处理newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{qDebug()<<"有新客户连接";//获取最新连接的客户端套接字//函数原型:virtual QTcpSocket *nextPendingConnection();//功能:获取最新连接客户端的套接字//参数:无//返回值:套接字指针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++){//socketList.at(i)->state(); //任意一个客户端的状态//函数原型:SocketState state() const;//功能:返回套接字的状态//参数:无//返回值:套接字状态,是个枚举值,如果为0,表示无效连接if(socketList.at(i)->state() == 0){//移除该客户端socketList.removeAt(i); //将下标为i的套接字从链表中移除}}//遍历客户端套接字,寻找是哪个客户端有数据待读for(int i=0; i<socketList.count(); i++){//判断当前套接字是否有数据待读//函数原型:qint64 bytesAvailable() const override;//功能:求出当前套接字中待读数据的个数//参数:无//返回值:待读数据的个数if(socketList.at(i)->bytesAvailable() != 0){//说明当前套接字中有数据//读取当前套接字中的数据//函数原型:QByteArray readAll();//功能:读取套接字中的所有数据//参数:无//返回值:QByteArray读取下来的数据QByteArray msg = socketList.at(i)->readAll();//将数据展示到ui界面ui->msgWidget->addItem(QString::fromLocal8Bit(msg));//将数据发送给所有客户端for (int j=0; j<socketList.count(); j++){//将数据写入到所有客户端套接字中socketList.at(j)->write(msg);}}}
}
3.时钟

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QTime>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void paintEvent(QPaintEvent *event) override;void timerEvent(QTimerEvent *e);private:Ui::Widget *ui;int tid;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);tid = startTimer(1);
}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *event)
{QPainter p(this);p.translate(this->width()/2,this->height()/2);QPen pen1(QColor("#fb7299"));pen1.setWidth(5);p.setPen(pen1);p.drawEllipse(QPoint(0,0),250,250);for(int i=0;i<60;i++){if(i%5==0){p.drawText(0,-225,QString("%1").arg(i/5));QPen pen2(QColor("#fb7299"));pen2.setWidth(5);p.setPen(pen2);p.drawLine(0,-240,0,-247);}else{p.setPen(pen1);p.drawLine(0,-245,0,-250);}p.rotate(6);}QTime t = QTime::currentTime();pen1.setColor("red");pen1.setWidth(20);p.setPen(pen1);p.rotate(t.hour()%12*30+t.minute()*0.5+t.second()*(0.5/60));p.drawLine(0,10,0,-100);QPainter p2(this);p2.translate(this->width()/2,this->height()/2);pen1.setColor("green");pen1.setWidth(10);p2.setPen(pen1);p2.rotate(t.minute()*6+t.second()*(6/60));p2.drawLine(0,15,0,-150);QPainter p3(this);p3.translate(this->width()/2,this->height()/2);pen1.setColor("blue");pen1.setWidth(5);p3.setPen(pen1);p3.rotate(t.second()*6);p3.drawLine(0,20,0,-200);
}void Widget::timerEvent(QTimerEvent *e)
{this->update();
}
相关文章:
7.28
1.思维导图 2.qt的sever #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器类 #include<QTcpSocket> //客户端类 #include<QMessageBox> //对话框类 #include<QList> …...
java线程中的常见方法(详解)
方法简介 方法名 功能 说明 start() 启动一个新线程,在新的线程运行 run 方法中的代码 start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的start方法只能调用一次,如…...
线程池参数配置
上次面试被人问到,如果是IO 密集型的任务,该如何配置合适的线程数,当初我说要按照IO具体的请求毫秒时间,来配置具体的线程数。 NthreadsNcpu*(1w/c) 公式中 W/C 为系统 阻塞率 w:等待时间 c:计算时间一般情况下,如果存…...
Spread for Winform 16.2.20231.0 (SP2) Crack
Spread for Winform 16.2.20231.0 (SP2)发布。此版本包含针对客户报告的问题的重要修复: 安装版本 16 后,FarPoint.Localization.dll 将丢失。 将数据绑定到 Spread 时会出现 InvalidOperationException。 通过 Spread Designer 设置的上标将不会保留。…...
Go程序结构
Go程序结构 1、名称 名称的开头是一个字母或下划线,且区分大小写。 实体第一个字母的大小写决定其可见性是否跨包: 若名称以大写字母开头,它是导出的,对包外是可见和可访问的,可以被自己包以外的其他程序所引用…...
JAVA面试总结-Redis篇章(四)——双写一致性
JAVA面试总结-Redis篇章(四)——双写一致性 问:redis 做为缓存,mysql的数据如何与redis进行同步呢?第一种情况,如果你的项目一致性要求高的话 采用以下逻辑我们应该先删除缓存,再修改数据库&…...
赋能医院数字化转型,医院拍摄VR全景很有必要
医院有没有必要拍摄制作VR全景呢?近期也有合作商问我们这个问题,其实VR智慧医院是趋势、也是机遇。现在外面很多的口腔医院、医美机构等都开始引入VR全景技术了,力求打造沉浸式、交互式的VR智慧医院新体验,通过VR全景展示技术来助…...
Vue3项目中没有配置 TypeScript 支持,使用 TypeScript 语法
1.安装 TypeScript:首先,需要在项目中安装 TypeScript。在终端中运行以下命令 npm install typescript --save-dev2.创建 TypeScript 文件:在 Vue 3 项目中,可以创建一个以 .ts 后缀的文件,例如 MyComponent.ts。在这…...
数据可视化大屏拼接屏开发实录:屏幕分辨率测试工具
一、可视化大屏开发 在数据可视化大屏开发时,确定数据可视化大屏拼接屏的板块尺寸需要考虑以下几个因素: 屏幕分辨率:首先需要知道每个板块屏幕的分辨率,包括宽度和高度,这决定了每个板块上可以显示的像素数量。 数据…...
每日一题7.28 209
209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 本题应该是用前缀…...
Python + Playwright 无头浏览器Chrome找不到元素
用Python Playwright调试时,发现不用无头浏览器(即headlessFalse)代码能够运行成功,但是一用无头浏览器时(即headlessTrue)就会报错,提示找不到元素。换成Firefox浏览器又不会有这个问题&#…...
C++信号量与共享内存实现进程间通信
关于信号量和共享内存的相关知识可参考下面链接: 进程间通信方式介绍_夜雨听萧瑟的博客-CSDN博客 C 创建共享内存_c共享内存_夜雨听萧瑟的博客-CSDN博客 信号量SytemV与Posix信号量的介绍与用法_夜雨听萧瑟的博客-CSDN博客 直接上代码,代码如下&#…...
[Tools: Camera Conventions] NeRF中的相机矩阵估计
参考:NeRF代码解读-相机参数与坐标系变换 - 知乎 在NeRF中,一个重要的步骤是确定射线(rays)的初始点和方向。根据射线的初始点和方向,和设定射线深度和采样点数量,可以估计该射线成像的像素值。估计得到的…...
【sgUpload】自定义上传组件,支持上传文件夹及其子文件夹文件、批量上传,批量上传会有右下角上传托盘出现,支持本地上传图片转换为Base64image
特性: 支持批量上传文件、文件夹可自定义headers可自定义过滤上传格式可自定义上传API接口支持drag属性开启可拖拽上传文件、文件夹 sgUpload源码 <template><div :class"$options.name" :dragenter"isDragenter"><!-- 上传按钮…...
Kafka 实时处理Stream与Batch的对比分析
Kafka 实时处理Stream与Batch的对比分析 一、简介1. Kafka的定义和特点2. Kafka实时处理基础架构 二、Stream和Batch1. Stream和Batch的区别2. 对比Stream和Batch的优缺点Stream的优缺点Batch的优缺点 三、使用场景1. 使用场景对比Batch使用场景Stream使用场景 2. 如何选择Stre…...
Andriod开发性能优化实践
文章目录 内存优化布局优化网络优化图片优化内存泄露绘制优化 内存优化 在Android开发中,有一些实践可以帮助进行内存优化,以减少应用程序的内存占用和提高性能。以下是一些常见的内存优化实践: 使用合适的数据结构和集合:选择合…...
linux环境安装mysql数据库
一:查看是否自带mariadb数据库 命令:rpm -qa | grep mariadb 如果自带数据库则卸载掉重新安装 命令:yum remove mariadb-connector-c-3.1.11-2.el8_3.x86_64 二:将压缩文件上传到/user/local/mysql文件夹 或者直接下载 命令&a…...
【深度学习中常见的优化器总结】SGD+Adagrad+RMSprop+Adam优化算法总结及代码实现
文章目录 一、SGD,随机梯度下降1.1、算法详解1)MBSGD(Mini-batch Stochastic Gradient Descent)2)动量法:momentum3)NAG(Nesterov accelerated gradient)4)权重衰减项(we…...
山东大学软件学院考试回忆——大二上
文章目录 学习科目整体回忆上课考试回忆Web技术大学物理概率与统计计算机组织与结构离散数学(2)数据结构(双语) 学习科目 Web技术大学物理概率与统计计算机组织与结构离散数学(2)(双语…...
【Express.js】异常分类和日志分级
异常分类和日志分级 第一章已经介绍过全局的异常处理了,但之前的做法过于简单,一股脑的捕获并返回。这一节我们将对异常进行细致的分类,并且日志也做标准化的分级。 准备工作 一个基础的 evp-express 项目 NodeJS Error 先了解一下 Node…...
如何一键搞定Switch游戏安装:Awoo Installer全面指南
如何一键搞定Switch游戏安装:Awoo Installer全面指南 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 还在为Switch游戏安装的繁琐流程而…...
英雄联盟智能游戏助手:提升游戏效率与自动化操作的全方位解决方案
英雄联盟智能游戏助手:提升游戏效率与自动化操作的全方位解决方案 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的英雄联…...
【vue】二、vue2仿去哪儿网app——首页开发实战:从零搭建到性能优化
1. 项目初始化与页面结构设计 开始一个Vue2仿去哪儿网App首页项目,首先要搭建基础框架。我习惯用vue-cli脚手架快速初始化项目,这个工具能帮我们处理好webpack配置、基础目录结构等繁琐工作。执行vue init webpack qunar-app命令后,会生成标…...
【超详细】前端必备:从0到1吃透JavaScript闭包,附真实项目避坑指南
文章目录第一章 从“变量生命周期”开始,重新理解作用域链1.1 一个让新手困惑的面试题:循环中的var与let1.2 作用域链的形成:函数定义位置决定了一切第二章 闭包的工程价值:从封装到模块化2.1 数据私有化:用闭包实现真…...
终极指南:5分钟学会用Wallpaper Engine下载器轻松获取创意工坊壁纸
终极指南:5分钟学会用Wallpaper Engine下载器轻松获取创意工坊壁纸 【免费下载链接】Wallpaper_Engine 一个便捷的创意工坊下载器 项目地址: https://gitcode.com/gh_mirrors/wa/Wallpaper_Engine 还在为Steam创意工坊里精美的动态壁纸无法直接下载而烦恼吗&…...
GAN训练过程可视化神器对比:GAN Lab和TensorFlow Playground到底怎么选?
GAN训练可视化工具深度评测:从交互设计到教学效果的全面对比 当开发者第一次接触生成对抗网络(GAN)时,往往会被其复杂的对抗训练机制所困扰。传统的静态图表和数学公式很难直观展示生成器与判别器之间微妙的博弈过程。这正是可视化…...
【数据结构】数组与特殊矩阵
数据结构的学习中,数组与特殊矩阵是基础且核心的内容。它们不仅是程序设计中最常用的线性结构,更是处理复杂矩阵运算的基础。本文将结合解析与真题,带你彻底搞懂数组的存储方式和特殊矩阵的压缩存储技巧。一、一维数组与二维数组:…...
嵌入式C语言状态机编程实践与优化
1. 状态机编程基础概念在嵌入式系统开发中,状态机(State Machine)是一种极其重要的编程范式。它通过定义系统可能处于的状态集合、状态之间的转换条件以及状态转换时执行的动作,来清晰地描述系统的行为逻辑。状态机之所以在嵌入式领域广泛应用࿰…...
AI爱好者成长手册:从“会用”到“用好”主流大模型的进阶之路
许多AI爱好者在使用大模型一段时间后会陷入一个困惑:为什么别人能用AI写出惊艳的文案、完成复杂的分析,而自己却总是得到平庸的结果?答案往往不在于模型的选择,而在于使用方式。经过在RskAi(www.rsk.cn) 平…...
我已战胜一切!感谢哥白尼,感谢爱因斯坦,感谢豆包,,,曾经我都经历过什么,我自己非常清楚,既有爱因斯坦的压缩版,又有哥白尼的压缩版,,,
不是时代不好,是人心中的成见就像一座大山般,无法被逾越,只有暴雨降下,洗刷这个世界,重塑这个宇宙,各位其位,大道至简。历史的车轮早已不可阻挡,,,暴风雨会来…...
