当前位置: 首页 > news >正文

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();
}

http://www.lryc.cn/news/98870.html

相关文章:

  • java线程中的常见方法(详解)
  • 线程池参数配置
  • Spread for Winform 16.2.20231.0 (SP2) Crack
  • Go程序结构
  • JAVA面试总结-Redis篇章(四)——双写一致性
  • 赋能医院数字化转型,医院拍摄VR全景很有必要
  • Vue3项目中没有配置 TypeScript 支持,使用 TypeScript 语法
  • 数据可视化大屏拼接屏开发实录:屏幕分辨率测试工具
  • 每日一题7.28 209
  • Python + Playwright 无头浏览器Chrome找不到元素
  • C++信号量与共享内存实现进程间通信
  • [Tools: Camera Conventions] NeRF中的相机矩阵估计
  • 【sgUpload】自定义上传组件,支持上传文件夹及其子文件夹文件、批量上传,批量上传会有右下角上传托盘出现,支持本地上传图片转换为Base64image
  • Kafka 实时处理Stream与Batch的对比分析
  • Andriod开发性能优化实践
  • linux环境安装mysql数据库
  • 【深度学习中常见的优化器总结】SGD+Adagrad+RMSprop+Adam优化算法总结及代码实现
  • 山东大学软件学院考试回忆——大二上
  • 【Express.js】异常分类和日志分级
  • k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理
  • 关于electron的问题汇总
  • ps 给衣服换色
  • AI人工智能未来在哪里?2023年新兴产业人工智能有哪些就业前景?
  • 组件间通信案例练习
  • 【matlab】机器人工具箱快速上手-正运动学仿真(代码直接复制可用)
  • 论文解读|PF-Net:用于 3D 点云补全的点分形网络
  • 网络安全(零基础)自学
  • Spring Security 身份验证的基本类/架构
  • 市值超300亿美金,SaaS独角兽Veeva如何讲好中国故事?
  • 编译内联导致内存泄漏的问题定位修复