QTday4(鼠标事件和键盘事件/QT实现连接TCP协议)

news2024/9/28 22:35:06

笔记

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QTcpServer>//服务器类
#include <QTcpSocket>//客户端类
#include <QMessageBox>
#include <QList>//链表容器

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_startBtn_clicked();
    void newConnection_slot();
    void 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();

    //将服务器设置成监听状态
    if(server->listen(QHostAddress::Any,port)){
//        QMessageBox::information(this,"","服务器启动成功");
        qDebug()<<"服务器启动成功";
    }else{
        QMessageBox::information(this,"","服务器启动失败");
    }

    //服务器进入了监听状态, 如果有客户端发来连接请求,那么该服务器就会自动发射一个newConnection信号
    //我们可以将该信号连接到自定义的槽函数
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}

//处理newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{
    qDebug()<<"有新用户连接";
    //获取最新连接的客户端套接字
    QTcpSocket* s = server->nextPendingConnection();
    //将该套接字放入到客户端容器中
    socketList.push_back(s);

    //此时,客户端与服务器已经建立起来连接
    //如果有客户端向服务器发来数据,那么该客户端会自动发射一个readyRead信号
    //我们可以在
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead);
}

//readyRead信号对于的槽函数的实现
void Widget::readyRead()
{
    //移除无效客户端
    for(int i=0;i<socketList.count();i++){
        if(socketList.at(i)->state() == 0){
            socketList.removeAt(i);
        }
    }

    for(int i=0;i<socketList.count();i++){
        if(socketList.at(i)->bytesAvailable() != 0){
            //说明该套接字中有数据
            //读取该套接字中的所有数据
            QByteArray msgArray = socketList.at(i)->readAll();

            //将数据展示到ui->listWidget
            ui->msgWidget->addItem(QString::fromLocal8Bit(msgArray));

            qDebug()<<QString::fromLocal8Bit(msgArray);

            //将数据发送给所有客户端
            for(int j=0;j<socketList.count();i++){
                socketList.at(j)->write(msgArray);
            }
        }
    }
}

时钟绘制

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

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

void Widget::paintEvent(QPaintEvent *event){
    drawDialPlate();
    drawDialLine();
}

void Widget::drawDialPlate()
{
    float dialWidth = 5.0;
    float radius = 250.0;
    float startPointX = this->width()*0.5;
    float startPointY = this->height()*0.5-radius;
    int hourRotate = 360/12;
    int quarterHourRotate = 360/60;

    //实例化一个画家
    QPainter painter(this);
    //实例化一个画笔
    QPen pen(QColor("red"));
    pen.setWidth(5);
    //添加画笔到画家
    painter.setPen(pen);

    //绘制表盘外圆
    QRectF rectangle(this->width()*0.5-radius, this->height()*0.5-radius, 2*radius, 2*radius);
    painter.drawEllipse(rectangle);

}

void Widget::drawDialLine()
{
    int Div_Max = 12;//大刻度值
    int Div_Min = 5;//小刻度值
    float BaseAngle = 270;//基础仰角
    int R_Inside = 250;//内部圆半径
    float startPointX = this->width()*0.5;
    float radius = 250.0;
    float startPointY = this->height()*0.5-radius;
    QPoint Center_pos = QPoint(startPointX,this->height()*0.5);//时钟圆心坐标

    //实例化一个画家
    QPainter painter(this);
    //实例化一个画笔
    QPen pen(QColor("black"));
//    pen.setWidth(10);
    //添加画笔到画家
    painter.setPen(pen);

    for(int Loop = 0; Loop <= Div_Max*Div_Min; Loop++)
    {
        float Angle = BaseAngle + (360 / (Div_Max * Div_Min))*Loop;//从基础仰角开始绘制的每条刻度线对应的角度
        int R = R_Inside-1;
        int x_start = Center_pos.x() + R * cos((Angle / 180) * PI);
        int y_start = Center_pos.y() + R * sin((Angle / 180) * PI);

        if(Loop % Div_Min == 0)//判断是否为大刻度
        {
            QPen pen(Qt::black);
            pen.setWidth(4);
            painter.setPen(pen);
            R = R_Inside-20;
        }
        else  //判断是否为小刻度
        {
            QPen pen(Qt::black);
            pen.setWidth(2);
            painter.setPen(pen);
            R = R_Inside-15;
        }

        int x_end = Center_pos.x() + R * cos((Angle / 180) * PI);
        int y_end = Center_pos.y() + R * sin((Angle / 180) * PI);

        painter.drawLine(QPoint(x_start,y_start),QPoint(x_end,y_end));//绘制刻度线
    }

}





/*
1程序启动,绘制表盘
2开启一个定时器, 槽函数里执行update
3绘制事件函数, 绘制最新的时分秒针
3.1获取当前的时间,获取时,分,秒数值float 转换成圆形的弧度
3.1画家的原点设置为widget的中心点/每次都旋转画家的正方向 指定角度
3.2绘制时针,分针,秒针
*/

 

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

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

相关文章

【数据结构】实验十二:图 查找

实验十二 图查找 一、实验目的与要求 1&#xff09;掌握拓扑排序的应用&#xff1b; 2&#xff09;掌握查找的概念和算法&#xff1b; 3&#xff09;掌握查找的基本原理以及各种算法的实现&#xff1b; 4&#xff09;掌握查找的应用。 二、实验内容 1. 用邻接表建立一…

安卓:百度地图开发(超详细)

一、百度地图介绍 百度地图SDK是一套供开发者使用的软件开发工具包&#xff08;SDK&#xff09;&#xff0c;用于在Android应用程序中集成和使用百度地图功能。通过使用百度地图SDK&#xff0c;开发者可以实现在自己的应用中显示地图、获取定位信息、进行搜索、导航等功能。 百…

机器视觉初步14:相机标定原理及应用

相机标定是指通过已知的相机参数&#xff0c;解算相机内部参数矩阵和外部参数矩阵。 文章目录 1.为什么要标定&#xff1f;2.工业场景中常见的标定方法2.1. 使用棋盘格标定板&#xff08;Checkerboard Markers&#xff09;2.2 使用相机自标定2.3. 使用三维物体标定2.4.九孔标…

MATLAB与ROS联合仿真——控制类功能模块介绍

1、Keyboard Control &#xff08;1&#xff09;输入参数&#xff1a;无 &#xff08;2&#xff09;输出参数&#xff1a;Speed Factor为输出的速度系数&#xff08;1代表前行&#xff0c;0停止&#xff0c;-1代表后退&#xff09;&#xff0c;Turn Factor为输出的舵机系数&am…

excel绘制折线图或者散点图

一、背景 假如现在通过代码处理了一批数据&#xff0c;想看数据的波动情况&#xff0c;是不是还需要写个pyhon代码&#xff0c;读取文件&#xff0c;绘制曲线&#xff0c;看起来也简单&#xff0c;但是还有更简单的方法&#xff0c;就是直接生成csv文件&#xff0c;csv文件就是…

windows11打不开任务管理器,

目录 第一章、win11系统任务管理器打不开&#xff1f;第二章、解决方式修改注册表 友情提醒&#xff1a; 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、win11系统任务管理器打不开&#xff1f; Win11任务管理…

达梦数据库DEM监控部署

1、安装达梦8数据库 在192.168.1.253 windows机器上安装达梦8数据库 解压dm8_setup_win64_ent_8.1.1.56_20200115.iso安装包运行安装程序setup.exe 数据库安装信息&#xff1a; 数据库名:CBDM 实例名:CBDM 数据库目录:D:\dmdbms\data 端口:5236 控制文件: D:\dmdbms\data\CBDM\…

技术复盘(5)--git

技术复盘--git 资料地址原理图安装配置基本命令分支命令对接gitee练习:远程仓库操作 资料地址 学习地址-B站黑马&#xff1a;https://www.bilibili.com/video/BV1MU4y1Y7h5 git官方&#xff1a;https://git-scm.com/ gitee官网&#xff1a;https://gitee.com/ 原理图 说明&am…

Vue-Router基本使用

1 安装&#xff1a; vue2项目要安装vue-router3版本 npm i vue-router3 2 src下创建router目录&#xff0c;router文件夹下创建index.js 在vue.config.js中 配置src路径别名 3 在main.js中引入 4 在app.vue中配置 5 即可看到内容

十分钟配置好Neovim go开发环境(其他语言一样)

文章目录 前言仓库地址用法快捷键问题反馈 前言 这篇文章的目的是为了分享下我自己的Neovim配置。 本人是Golang程序员&#xff0c;最开始使用的IDE是JetBrains Goland。有一说一这个ide适配度很高&#xff0c;认识的很多人都使用这个。但是它也有几个对我来说的缺点&#xf…

JSP 结构和指令

JSP 结构 网络服务器需要一个 JSP 引擎&#xff0c;也就是一个容器来处理 JSP 页面。容器负责截获对 JSP 页面的请求。本教程使用内嵌 JSP 容器的 Apache 来支持 JSP 开发。 JSP 容器与 Web 服务器协同合作&#xff0c;为JSP的正常运行提供必要的运行环境和其他服务&#xff…

低代码:告别繁琐,提速软件开发

一、前言 数字化进程加速&#xff0c;对于软件开发效率和成本的要求在不断提高。与此同时&#xff0c;低代码技术的出现为这项高成本的人力开发提供了便捷。目前&#xff0c;低代码已广泛应用于各行各业&#xff0c;帮助企业提高应用开发效率、降低开发成本、提高软件质量&…

Vue 3:玩一下web前端技术(四)

前言 本章内容为VUE开发环境的使用与相关使用讨论。 上一篇文章地址&#xff1a; Vue 3&#xff1a;玩一下web前端技术&#xff08;三&#xff09;_Lion King的博客-CSDN博客 下一篇文章地址&#xff1a; &#xff08;暂无&#xff09; 一、开发环境的使用 1、汉化VScod…

提升设计技能,教你玩转CAD中的辅助命令

大家好&#xff0c;今天先来了解一下CAD软件中的视图操作。 CAD设计中的辅助命令是实现精准和高效设计的关键要素。熟练掌握并正确运用CAD中的各类辅助命令&#xff0c;对于设计师们来说至关重要。本文将为您提供如何正确使用CAD中的辅助命令的实用指南&#xff0c;帮助您优化…

动手学深度学习——实战Kaggle比赛:预测房价(代码详解+调参优化)

目录 1. 下载和缓存数据集2. Kaggle3. 访问和读取数据集4. 数据预处理5. 训练6. K折交叉验证7. 模型选择8. 提交Kaggle预测9. 调参优化 1. 下载和缓存数据集 数据集百度云&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/14CVZBjmlKA_c3MYNFLSvbg?pwdpysi 提取码&…

脚手架(vue-cli)的安装详细教程

首先要下载node.js 下载 | Node.js 中文网 (nodejs.cn)https://nodejs.cn/download/ 大家根据自己的系统来选择哪个&#xff0c;我是Windows系统&#xff0c;所以选择红色箭头所指的安装包去安装&#xff01;&#xff01;&#xff01; 接下来双击安装&#xff01;&#xff01;…

Docker 如何助您成为数据科学家

一、说明 在过去的 5 年里&#xff0c;我听到了很多关于 docker 容器的嗡嗡声。似乎我所有的软件工程朋友都在使用它们来开发应用程序。我想弄清楚这项技术如何使我更有效率&#xff0c;但我发现网上的教程要么太详细&#xff1a;阐明我作为数据科学家永远不会使用的功能&#…

英伟达 H100 vs. 苹果M2,大模型训练,哪款性价比更高?

M1芯片 | Uitra | AMD | A100 M2芯片 | ARM | A800 | H100 关键词&#xff1a;M2芯片&#xff1b;Ultra&#xff1b;M1芯片&#xff1b;UltraFusion&#xff1b;ULTRAMAN&#xff1b;RTX4090、A800;A100&#xff1b;H100&#xff1b;LLAMA、LM、AIGC、CHATGLM、LLVM、LLM、LLM…

C语言每日一题之整数求二进制1的个数

今天分享一道题目&#xff0c;用三种方法来求解 二进制1的个数 方法1 我们的十进制除10和取余数就可以得到我们每一位的数字&#xff0c;那我们的二进制也可 以 #include<stdio.h> int num_find_1(unsigned int n) {int count 0;while (n){if (1 n % 2){count;}n / 2…