Qt : day4

news2024/11/18 5:09:13

1.思维导图

 2.服务器

#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->portedt->text().toUInt();

    //将服务器设置监听状态
    //函数原型:bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
    //功能:将服务器设置成监听状态
    //参数1:连接的主机地址,QHostAddress::Any,允许任意主机进行连接,当然,也可以指定主机号进行连接
    //参数2:连接进来所需端口号,0表示任意端口号进行访问,也可以指定端口号进行访问服务器
    //返回值:成功返回true,失败返回false
    if (server->listen(QHostAddress::Any, port))
    {
        QMessageBox::information(this, "", "服务器启动成功");
    }else
    {
        QMessageBox::information(this, "", "服务器启动失败");
    }

    //此时服务器进入监听,如果客户端发来连接请求,那么服务器自动发射newConnection信号
    //我们可以将该信号连接到自定义的槽函数处理新连接的套接字
    connect(server, &QTcpServer::newConnection, this, &Widget::newconnect_slot);
}

//处理newConnection信号的槽函数的实现
void Widget::newconnect_slot()
{
    qDebug() << "有新用户连接";

    //获取新连接的套接字
    //函数原型:[virtual] QTcpSocket *QTcpServer::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.size(); i++)
    {
        //对第i个客户端的状态进行判断,如果是无连接的 状态,则进行移除
        //QAbstractSocket::SocketState QAbstractSocket::state() const
        //功能:查看客户端的状态
        //参数:无
        //返回值:当前客户端的状态
        if(socketList.at(i)->state() == 0)
        {
            //如果当前状态无连接的,则进行移除
            socketList.removeAt(i);
        }
    }

    //将所有有效的客户端进行遍历,查看是哪个客户端中有数据待读
    for(int i=0; i<socketList.size(); i++)
    {
        //判断当前客户端是否有待读数据
        //qint64 QAbstractSocket::bytesAvailable() const
        //功能:返回待读数据的字节数
        //参数:无
        if(socketList.at(i)->bytesAvailable() != 0)
        {
            //读取数据
            //QByteArray QIODevice::readAll()
            //功能:读取出当前客户端中所有信息
            //参数:无
            //返回值:字节数组
            QByteArray msg = socketList.at(i)->readAll();

            //将读取的数据展示到自身的ui界面
            ui->msgWidget->addItem(QString::fromLocal8Bit(msg));

            //将该消息广播给所有客户端
            for(int j=0; j<socketList.size(); j++)
            {
                socketList.at(j)->write(msg);
            }
        }
    }

 3.时钟

 

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //    this->setFixedSize(width, height);

    timer = new QTimer;
    timer->start(1000);

    connect(timer, &QTimer::timeout, [&](){
        count++;
        update();
    });

    //获取系统时间
    QString t = QTime::currentTime().toString("h:m:s ap");

    QStringList list1 = t.split(" ");

    QStringList list2 = list1[0].split(":");

    for (int i=0; i<list2.size(); i++)
    {
        qDebug() << list2.at(i);
    }

    hour = list2[0].toUInt();
    minute = list2[1].toUInt();
    second = list2[2].toUInt();
    qDebug() << "hour:" << hour << "minute:" << minute << "second" << second;
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    //定义画家类绘制圆
    QPainter p(this);
    QPen pen(QColor("purple"));
    pen.setWidth(3);
    QBrush b("pink");
    p.setPen(pen);
    p.setBrush(b);

    p.translate(this->width()/2, this->height()/2);
    p.drawEllipse(QPoint(0, 0), 200, 200);

    //使用画家类绘制刻度
    pen.setColor(QColor("black"));
    p.setPen(pen);
    for (int i=0; i<60; i++)
    {
        p.rotate(6);
        p.drawLine(QPoint(200, 0), QPoint(195, 0));
    }

    pen.setWidth(5);
    p.setPen(pen);
    for (int i=0; i<12; i++)
    {
        p.drawLine(QPoint(200, 0), QPoint(190, 0));
        p.rotate(30);
        p.drawText(QPoint(0, -170), QString("%1").arg(i+1));
    }

    //制作时针
    pen.setWidth(10);
    pen.setColor(QColor("red"));
    p.setPen(pen);
    p.rotate(hour*30+6*second/60/12+30*minute/60+6*count/60/12);
    p.drawLine(QPoint(0, -50), QPoint(0, 5));

    //制作分针
    QPainter p1(this);
    p1.translate(this->width()/2, this->height()/2);
    pen.setWidth(6);
    pen.setColor(QColor("blue"));
    p1.setPen(pen);
    p1.rotate(6*count/60+minute*6+6*second/60);
    p1.drawLine(QPoint(0, -80), QPoint(0, 8));

    //制作秒针
    QPainter p2(this);
    p2.translate(this->width()/2, this->height()/2);
    pen.setWidth(3);
    pen.setColor(QColor("green"));
    p2.setPen(pen);
    p2.rotate(6*count+second*6);
    p2.drawLine(QPoint(0, -120), QPoint(0, 12));
}

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

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

相关文章

Pytorch(一)

目录 一、基本操作 二、自动求导机制 三、线性回归DEMO 3.1模型的读取与保存 3.2利用GPU训练时 四、常见的Tensor形式 五、Hub模块 一、基本操作 操作代码如下: import torch import numpy as np#创建一个矩阵 x1 torch.empty(5,3)# 随机值 x2 torch.rand(5,3)# 初始化…

grid网格布局看这一篇就够了(接近3w字的总结)

在当今现代Web设计中&#xff0c;如何实现有效的布局一直是一个关键问题。这就是为什么CSS3推出了“grid网格布局”作为一种新的布局方式。使用grid&#xff0c;您可以轻松地设置复杂的网格布局&#xff0c;而无需使用冗长的CSS代码或框架。本文将探讨grid的概念、语法和实际应…

青大数据结构【2021】

一、单选&#xff08;17&#xff01;&#xff09; 根据中序遍历得到降序序列可以知道&#xff0c;每个结点的左子树的结点的值比该结点的值小&#xff0c;因为没有重复的关键字&#xff0c;所以拥有最大值的结点没有左子树。 二、简答 三、分析计算 四、算法分析 3.迪杰斯特拉…

DAY53:动态规划(十八)最长公共子序列+不相交的线+最大子序列和

文章目录 1143.最长公共子序列(注意递推的逻辑)思路DP数组含义递推公式初始化完整版重要&#xff1a;该解法是否保持了元素顺序总结 1035.不相交的线&#xff08;注意思路&#xff09;思路完整版 53.最大子序列和思路1&#xff1a;贪心思路1完整版思路2&#xff1a;动态规划DP数…

java商城系统和php商城系统对比

java商城系统和php商城系统是两种常见的电子商务平台&#xff0c;它们都具有一定的优势和劣势。那么&#xff0c;java商城系统和php商城系统又有哪些差异呢&#xff1f; 一、开发难度 Java商城系统和PHP商城系统在开发难度方面存在一定的差异。Java商城系统需要使用Java语言进…

【前端工程化】未使用docker时,前端项目实现线上秒级回滚

目录 一. 前言 二. 思路 三. 实践 3.1 准备单页应用项目 3.2 保存历史构建index.html内容 3.3 模拟服务端托管前端应用 3.4 快速回滚node服务端代码开发 3.5 快速回滚前端可视化页面开发 3.6 快速回滚测试 四. 总结 一. 前言 项目快速回滚是前端工程化中很重要的一环&…

【项目】轻量级HTTP服务器

文章目录 一、项目介绍二、前置知识2.1 URI、URL、URN2.2 CGI2.2.1 CGI的概念2.2.2 CGI模式的实现2.2.3 CGI的意义 三、项目设计3.1 日志的编写3.2 套接字编写3.3 HTTP服务器实现3.4 HTTP请求与响应结构3.5 EndPoint类的实现3.5.1 EndPoint的基本逻辑3.5.2 读取请求3.5.3 构建响…

yolov5 onnx模型 转为 rknn模型

1、转换为rknn模型环境搭建 onnx模型需要转换为rknn模型才能在rv1126开发板上运行&#xff0c;所以需要先搭建转换环境 模型转换工具 模型转换相关文件下载&#xff1a; 网盘下载链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;teuc 将其移动到虚拟机中&#xf…

用于提取数据的三个开源NLP工具

开发人员和数据科学家使用生成式AI和大语言模型&#xff08;LLM&#xff09;来查询大量文档和非结构化数据。开源LLM包括Dolly 2.0、EleutherAI Pythia、Meta AI LLaMa和StabilityLM等&#xff0c;它们都是尝试人工智能的起点&#xff0c;可以接受自然语言提示&#xff0c;生成…

3d动画用云渲染靠谱吗?有什么不同?

3d动画是一种利用计算机技术制作的动画形式&#xff0c;它可以模拟真实世界的物体和场景&#xff0c;创造出各种惊人的效果和视觉体验。3d动画广泛应用于影视、游戏、广告、教育等领域&#xff0c;成为当今最流行的艺术表现形式之一。据统计&#xff0c;2019年全球3d动画市场规…

[STL]list使用介绍

[STL]list使用 注&#xff1a;本文测试环境是visual studio2019。 文章目录 [STL]list使用1. list介绍2. 构造函数3. 迭代器相关函数begin函数和end函数rbegin函数和rend函数 4. 容量相关函数empty函数size函数 5. 数据修改函数push_back函数和pop_back函数push_front函数和pop…

软件兼容性测试的重要性以及一些常用的测试方法

随着软件应用的不断发展&#xff0c;不同操作系统、浏览器、设备和平台的广泛应用&#xff0c;软件兼容性变得越来越重要。在开发和发布软件之前进行兼容性测试是确保软件在多个环境下正常运行的关键步骤。本文将介绍软件兼容性测试的重要性以及一些常用的测试方法。 首先&…

JMeter常用内置对象:vars、ctx、prev

在前文 Beanshell Sampler 与 Beanshell 断言 中&#xff0c;初步阐述了JMeter beanshell的使用&#xff0c;接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注&#xff1a;示例使用JMeter版本为5.1 1. vars 如 API 文档 所言&#xff0c;这是定义变量的类&a…

SpringBoot版本升级引起的FileNotFoundException——WebMvcConfigurerAdapter.class

缘起 最近公司项目要求JDK从8升到17&#xff0c;SpringBoot版本从2.x升级到3.x&#xff0c;期间遇到了一个诡异的FileNotFoundException异常&#xff0c;日志如下&#xff08;敏感信息使用xxx脱敏&#xff09; org.springframework.beans.factory.BeanDefinitionStoreExcepti…

安科瑞智能型BA系列电流传感器

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 选型

微信小程序——同一控件的点击与长按事件共存的解决方案

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

一份 GitHub star 过万的 1121 页图解算法让“他”成功杀进字节跳动

前两天收到读者喜报&#xff0c;说是进字节了&#xff0c;和他交流了一下他的学习心得&#xff0c;发现他看的资料也是我之前推荐过的算法进阶指南&#xff0c;这里推荐给大家&#xff0c;github star 可是过万哦&#xff01;质量非常高&#xff01; 这份算法笔记与其他的不同&…

使用andlua+写一个获取VSCode最新版本号的安卓软件

点击加号 选择Defalut模板 名称改为vscv 包名改为com.b.vscv 编辑main.lua require "import" import "android.app.*" import "android.os.*" import "android.widget.*" import "android.view.*" import "layout&qu…

微信小程序开发总结

架构分析 软件应用架构包括&#xff1a; 数据层、业务逻辑层、服务处、控制层、展示层、用户&#xff0c;小程序属于展示层&#xff0c;通常还需要其他层次提供支持 主体文件&#xff1a; app.js,app.json,app.wxss&#xff0c;前两者是必须存在再根目录下&#xff0c;app.wxs…

【网络云盘客户端】——上传文件的功能的实现

目录 上传文件功能的实现 uploadtask的设计 设置上传的槽函数 uploadFileAction接口 uploadFile接口 定时上传文件 进度条的设计 上传文件功能的实现 上传文件功能实现 1.双击 ”上传文件 “的 QListWidgetItem 或者 点击 “上传” 菜单项 都会弹出一个文件对话框 2.在文…