Qt : day4

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

25.8 matlab里面的10中优化方法介绍—— 拉各朗日乘子法求最优化解(matlab程序)

1.简述 拉格朗日乘子法&#xff1a; 拉格朗日乘子法&#xff08;Lagrange multipliers&#xff09;是一种寻找多元函数在一组约束下的极值的方法。通过引入拉格朗日乘子&#xff0c;可将有 变量与 约束条件的最优化问题转化为具有变量的无约束优化问题求解 举个例子&#xff…

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型 版本更新&#xff1a; 2023/7/29版本&#xff1a; 1.增加自定义参数&#xff0c;方便直接套数据运行。 pre_num3;%预采样数据个数 learn_pr0.85; %训练数据比例&#xff08;不包括预采样数…

使用 ChatGPT 进行研究的先进技术

在这篇文章中&#xff0c;您将探索改进您研究的先进技术。尤其&#xff0c; 分析和解释研究数据进行文献综述并找出研究差距废话不多说直接开始吧&#xff01;&#xff01;&#xff01; 分析和解释研究数据 一家小企业主希望分析客户满意度数据以改善客户服务。他们使用包含 10…

边缘计算对现代交通的重要作用

边缘计算之所以重要&#xff0c;是在于即使在5G真正商用之时&#xff0c;可以实现超大带宽&#xff08;eMBB&#xff09;的应用场景&#xff0c;但庞大数据量的涌现也就意味着需要在云和端传输过程中找到一个承接点&#xff0c;对数据进行预处理再选择是否上云。 边缘计算应用演…

源码学习初章-基础知识储备

文章目录 学前准备源码地址引言extern "C" 宏定义平台宏跨平台宏vstdio平台禁用警告宏 连接、双层宏定义函数宏系统函数宏自定义函数宏多语句执行宏do while0 普通宏定义 C的一些必备函数知识回调函数和函数指针回调函数wireshark-4.0.7源码例子函数指针wireshark4.0…

kafka集群搭建(Linux环境)

zookeeper搭建&#xff0c;可以搭建集群&#xff0c;也可以单机&#xff08;本地学习&#xff0c;没必要搭建zookeeper集群&#xff0c;单机完全够用了&#xff0c;主要学习的是kafka&#xff09; 1. 首先官网下载zookeeper&#xff1a;Apache ZooKeeper 2. 下载好之后上传到…

自动化测试框架unittest与pytest的区别!

引言 前面文章已经介绍了python单元测试框架&#xff0c;大家平时经常使用的是unittest&#xff0c;因为它比较基础&#xff0c;并且可以进行二次开发&#xff0c;如果你的开发水平很高&#xff0c;集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别&…

Grafana - TDEngine搭建数据监测报警系统

TDengine 与开源数据可视化系统 Grafana 快速集成搭建数据监测报警系统 一、介绍二、前置条件三、Grafana 安装及配置3.1 下载3.2 安装3.2.1 windows安装 - 图形界面3.2.2 linux安装 - 安装脚本 四、Grafana的TDEngine配置及使用4.1 登录4.2 安装 Grafana Plugin 并配置数据源4…

流数据湖平台Apache Paimon(一)概述

文章目录 第1章 概述1.1 简介1.2 核心特性1.3 基本概念1.3.1 Snapshot1.3.2 Partition1.3.3 Bucket1.3.4 Consistency Guarantees一致性保证 1.4 文件布局1.4.1 Snapshot Files1.4.2 Manifest Files1.4.3 Data Files1.4.4 LSM Trees 第1章 概述 1.1 简介 Flink 社区希望能够将…

10.python设计模式【代理模式】

内容&#xff1a;为其他对象提供一种代理一控制对这个对象的访问 应用场景&#xff1a; 远程代理&#xff1a; 为远程的对象提供代理虚代理&#xff1a;根据需要创建很大的对象保护代理&#xff1a;控制对原始对象的访问&#xff0c;用于对象有不同访问权限时 UML图 举个例…

新零售行业如何做会员管理和会员营销

蚓链数字化营销系统全渠道会员管理解决方案&#xff0c;线上线下统一管理&#xff0c;打造私域流量&#xff0c;微信、门店会员全渠道管理&#xff0c;打通私域流量池&#xff0c;实现裂变营销&#xff1a; 开启新零售之路&#xff0c;必然要摒弃原有的管理模式&#xff0c;大…

实训笔记7.27

实训笔记7.27 7.27笔记一、Hive数据仓库基本概念&#xff08;处理结构化数据&#xff09;1.1 Hive的组成架构1.1.1 Hive的客户端1.1.2 Hive的驱动程序1.1.3 Hive的元数据库 1.2 Hive和数据库的区别 二、Hive的安装配置三、Hive的相关配置项四、Hive的基本使用方式4.1 使用Hive的…

DMA传输原理与实现详解(超详细)

DMA&#xff08;Direct Memory Access&#xff0c;直接内存访问&#xff09;是一种计算机数据传输方式&#xff0c;允许外围设备直接访问系统内存&#xff0c;而无需CPU的干预。 文章目录 Part 1: DMA的工作原理配置阶段&#xff1a;数据传输阶段&#xff1a; Part 2: DMA数据…

Jmeter+MySQL链接+JDBC Connection配置元件+使用

参考大大的博客学习&#xff1a;怎么用JMeter操作MySQL数据库&#xff1f;看完秒懂&#xff01;_jmeter mysql_程序员馨馨的博客-CSDN博客 注&#xff1a;里面所有没打码的都是假数据&#xff0c;麻烦大家自行修改正确的信息。 一、背景 需要取数据库中的值&#xff0c;作为…

分布式操作系统会不会是操作系统的终端形态?

昨天一位网友私信我&#xff0c;提出一个问题&#xff1a;“Laxcus分布式操作系统会不会是操作系统发展的终极形态&#xff1f;”。今天觉得有必要把这件事说一说&#xff0c;所以就忙里偷闲写下这篇文章。 咱们先说结论&#xff1a;是也不是&#xff0c;需要具体情况具…

C++--菱形继承

1.什么是菱形继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承的问题&#xff1a;菱形继承有数据冗余和二义性的问题&#xff0c;数据冗余是由于创建多个相同类型的…

Gradle和Maven的区别

Gradle和Maven 当涉及到构建和管理项目时&#xff0c;Gradle和Maven是两个非常流行的选项。本文将讨论Gradle和Maven之间的区别以及它们的配置信息差异。 1. Gradle和Maven的区别 1.1 构建脚本语言 Maven使用XML作为构建脚本语言&#xff0c;而Gradle使用基于Groovy的DSL&…

❤️创意网页:创意动态画布~缤纷移动涂鸦~图片彩色打码

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

【Vue】在el-table的el-table-column中,如何控制单行、单列、以及根据内容单独设置样式。例如:修改文字颜色、背景颜色

用cell-style表属性来实现。在官网中是这样表述这个属性的。 在el-table中用v-bind绑定此属性。&#xff08;v-bind的简写是&#xff1a;&#xff09; <el-table:data"options":cell-style"cell"><el-table-column prop"id" label"…

设计模式-建造者模式

在前面几篇文章中&#xff0c;已经讲解了单例模式、工厂方法模式、抽象工厂模式&#xff0c;创建型还剩下一个比较重要的模式-建造者模式。在理解该模式之前&#xff0c;我还是希望重申设计模式的初衷&#xff0c;即为解决一些问题而提供的优良方案。学习设计模式遗忘其初衷&am…