Qt(day4)

news2024/9/24 23:50:39

思维导图

 QT连接TCP网络通信

服务器

ser.h

#ifndef SER_H
#define SER_H

#include <QWidget>
#include<QTcpServer>    //服务器头文件
#include<QTcpSocket>    //客户端头文件
#include<QMessageBox>   //消息对话框
#include<QList>         //链表头文件

QT_BEGIN_NAMESPACE
namespace Ui { class Ser; }
QT_END_NAMESPACE

class Ser : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_connectbtn_clicked();

    void newConnection_slot();  //处理newConnection信号的槽函数
    void readyRead_slot();      //处理readyRead信号的槽函数

private:
    Ui::Ser *ui;

    QTcpServer *server;             //定义服务器指针
    QList<QTcpSocket *> clientList; //定义客户端容器
};
#endif // SER_H

ser.cpp

#include "ser.h"
#include "ui_ser.h"

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

    server=new QTcpServer(this);    //实例化一个服务器

    connect(server,&QTcpServer::newConnection,this,&Ser::newConnection_slot);
}

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

//启动服务器按钮对应的槽函数
void Ser::on_connectbtn_clicked()
{
    quint16 port=ui->portbtn->text().toUInt();
    if(server->listen(QHostAddress::Any,port)){
        QMessageBox::information(this,"成功","服务器启动成功");
    }
    else{
        QMessageBox::information(this,"失败","服务器启动失败");
        return;
    }
}
//处理newConnection信号的槽函数
void Ser::newConnection_slot(){
    QTcpSocket *s=server->nextPendingConnection();  //获取最新连接的客户端套接字

    clientList.push_back(s);    //将套接字放入客户端链表中

    connect(s,&QTcpSocket::readyRead,this,&Ser::readyRead_slot);
}
//处理readyRead信号的槽函数
void Ser::readyRead_slot(){
    for(int i=0;i<clientList.count();i++){
        if(clientList[i]->state()==0){
            clientList.removeAt(i);
        }
    }

    for(int i=0;i<clientList.count();i++){
        if(clientList[i]->bytesAvailable()!=0){
            QByteArray msg=clientList[i]->readAll();
            ui->msgwidget->addItem(QString::fromLocal8Bit(msg));

            for(int j=0;j<clientList.count();j++){
                clientList[j]->write(msg);
            }
        }
    }
}

客户端

cli.h

#ifndef CLI_H
#define CLI_H

#include <QWidget>
#include<QTcpSocket>
#include<QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class cli; }
QT_END_NAMESPACE

class cli : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_connectbtn_clicked();
    void on_sendbtn_clicked();
    void on_disconnectbtn_clicked();

    void connected_slot();
    void readyRead_slot();
    void disconnected_slot();


private:
    Ui::cli *ui;

    QTcpSocket *socket;

    QString username;
};
#endif // CLI_H

cli.cpp

#include "cli.h"
#include "ui_cli.h"

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

    socket=new QTcpSocket(this);

    ui->disconnectbtn->setEnabled(false);
    ui->sendbtn->setEnabled(false);
    ui->msgedit->setEnabled(false);

    connect(socket,&QTcpSocket::connected,this,&cli::connected_slot);

    connect(socket,&QTcpSocket::readyRead,this,&cli::readyRead_slot);

    connect(socket, &QTcpSocket::disconnected, this, &cli::disconnected_slot);
}

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

void cli::on_connectbtn_clicked()
{
    username=ui->usernameedit->text();
    QString ip=ui->ipedit->text();
    quint16 port=ui->portedit->text().toUInt();

    socket->connectToHost(ip,port);
}

void cli::connected_slot(){
    ui->disconnectbtn->setEnabled(true);
    ui->sendbtn->setEnabled(true);
    ui->msgedit->setEnabled(true);
    ui->usernameedit->setEnabled(false);
    ui->ipedit->setEnabled(false);
    ui->portedit->setEnabled(false);
    ui->connectbtn->setEnabled(false);
    QMessageBox::information(this,"成功","成功进入聊天室");
    QString msg=username+": 进入聊天室";

    socket->write(msg.toLocal8Bit());
}

void cli::readyRead_slot(){
    QByteArray msg=socket->readAll();

    ui->msgwidget->addItem(QString::fromLocal8Bit(msg));
}

void cli::on_sendbtn_clicked()
{
    QString msg=username+": "+ui->msgedit->text();

    socket->write(msg.toLocal8Bit());

    ui->msgedit->clear();
}

void cli::on_disconnectbtn_clicked()
{
    QString msg=username+": 离开聊天室";

    socket->write(msg.toLocal8Bit());

    socket->disconnectFromHost();
}

void cli::disconnected_slot(){
    ui->disconnectbtn->setEnabled(false);
    ui->sendbtn->setEnabled(false);
    ui->msgedit->setEnabled(false);
    ui->usernameedit->setEnabled(true);
    ui->ipedit->setEnabled(true);
    ui->portedit->setEnabled(true);
    ui->connectbtn->setEnabled(true);
    QMessageBox::information(this,"退出","退出成功");
}

效果图

 绘制一个时钟

clockwidget.h

#ifndef CLOCKWIDGET_H
#define CLOCKWIDGET_H

#include <QWidget>
#include<QPainter>
#include<QTimer>
#include<QTime>

class ClockWidget : public QWidget
{
    Q_OBJECT
public:
    ClockWidget(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *);
};

#endif // CLOCKWIDGET_H

clockwidget.cpp

#include "clockwidget.h"


ClockWidget::ClockWidget(QWidget *parent) : QWidget(parent)
{
    setFixedSize(400, 400);

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, QOverload<>::of(&ClockWidget::update));
    timer->start(1000);
}

void ClockWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QTime currentTime = QTime::currentTime();

    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.translate(width() / 2, height() / 2);
    painter.scale(width() / 200.0, height() / 200.0);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::white);
    painter.drawEllipse(QPoint(0, 0), 90, 90);

    painter.setPen(Qt::black);
    for (int i = 1; i <= 12; ++i) {
        painter.drawLine(0, 70, 0, 80);
        painter.rotate(30);
    }

    painter.setPen(Qt::gray);
    for (int i = 0; i < 60; ++i) {
        if (i % 5 != 0)
            painter.drawLine(0, 70, 0, 75);
        painter.rotate(6);
    }

    //时针
    painter.setPen(Qt::black);
    painter.save();
    painter.rotate(30.0 * ((currentTime.hour() + currentTime.minute() / 60.0)));
    painter.drawLine(0, 0, 0, -40);
    painter.restore();

    //分针
    painter.setPen(Qt::blue);
    painter.save();
    painter.rotate(6.0 * ((currentTime.minute() + currentTime.second() / 60.0)));
    painter.drawLine(0, 0, 0, -60);
    painter.restore();

    //秒针
    painter.setPen(Qt::red);
    painter.save();
    painter.rotate(6.0 * currentTime.second());
    painter.drawLine(0, 0, 0, -70);
    painter.restore();

    painter.setPen(Qt::black);
    painter.setBrush(Qt::black);
    painter.drawEllipse(QPoint(0, 0), 3, 3);
}

效果图 

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

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

相关文章

已解决 ValueError: Found array with dim 3. Estimator expected <= 2.

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

“新”心相印 | 长沙市网络代表人士培训班“破冰”联谊“湘”味十足

搜狐网湖南&#xff08;文/莫谦&#xff09;9月18日至9月22日&#xff0c;首期长沙市网络代表人士专题培训班在北京大学举行&#xff0c;培训班学员主要是长沙网络名人联盟成员&#xff0c;涵盖抖音达人、微博博主、网络作家、网络大V等。 为了加强长沙网络名人联盟组织建设&a…

exec函数族

1.execl函数 #include <unistd.h> int execl(const char *path, const char *arg, ...); 参数&#xff1a; -path:需要指定的执行文件的路径或者名称 -*arg:是可执行文件所需要的参数列表 第一个参数一般没有什么作用&#xff0c;一般写的是执行的程序的名称 从第二个参…

鉴源实验室 | 系统逻辑漏洞挖掘实践

作者 | 林海文 上海控安可信软件创新研究院汽车网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 前 言 当谈及安全测试时&#xff0c;逻辑漏洞挖掘一直是一个备受关注的话题&#xff0c;它与传统的安全漏洞&#xff08;如…

SSM整合(细节拉满)|将Mybatis、Spring、SpringMVC三个框架整合起来,通过一个demo来练习

环境要求 环境: IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 要求: 需要熟练掌握MySQL数据库&#xff0c;Spring&#xff0c;JavaWeb及MyBatis知识&#xff0c;简单的前端知识; 数据库环境 创建一个存放书籍数据的数据库表&#xff0c;并插入一些示例数据 SSM整合 新建一个空的M…

网安须知|什么是护网行动?什么是红蓝对抗?

01 什么是护网行动 护网行动是以公安部牵头的&#xff0c;用以评估企事业单位的网络安全的活动。 具体实践中&#xff0c;公安部会组织攻防两方&#xff0c;进攻方会在一个月内对防守方发动网络攻击&#xff0c;检测出防守方&#xff08;企事业单位&#xff09;存在的安全漏洞…

深入学习 Redis - 分布式锁底层实现原理,以及实际应用

目录 一、Redis 分布式锁 1.1、什么是分布式锁 1.2、分布式锁的基础实现 1.2.1、引入场景 1.2.2、基础实现思想 1.2.3、引入 setnx 1.3、引入过期时间 1.4、引入校验 id 1.5、引入 lua 脚本 1.5.1、引入 lua 脚本的原因 1.5.2、lua 脚本介绍 1.6、过期时间续约问题&…

OpenMMLab MMYOLO目标检测应用示例与常见问题(三)

基于MMYOLO的电离图实时目标检测基准 数据集 数字电离图是获取实时电离层信息的最重要方式。电离层结构检测对于准确提取电离层关键参数具有重要的研究意义。 本研究利用中国科学院在海南、武汉和怀来获得的4311张不同季节的电离图建立数据集。使用labelme手动注释包括 Laye…

实现高并发内存池(C++)

什么是内存池 池化技术 所谓“池化技术”&#xff0c;就是程序先向系统申请过量的资源&#xff0c;然后自己管理以备不时之需。之所以要申请过量的资源&#xff0c;是因为每次申请该资源都有较大的开销&#xff0c;不如提前申请好&#xff0c;这样使用时就会变得非常快捷&…

2023年华数杯数学建模C题母亲身心健康对婴儿成长的影响解题全过程文档及程序

2023年华数杯全国大学生数学建模 C题 母亲身心健康对婴儿成长的影响 原题再现&#xff1a; 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c;还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、…

同为科技(TOWE)专业防雷滤波桌面PDU超级插座

2023年第19届杭州亚运会开幕在即&#xff0c;相较于以往&#xff0c;本届杭州亚运会的一大看点就是电竞项目将首次以正式比赛项目的身份亮相亚运赛场&#xff0c;让更多受众能够领略电竞的魅力。当前社会&#xff0c;电竞作为一种新兴的娱乐、社交方式&#xff0c;让很多年轻人…

Feign实战-Springboot集成OpenFeign Demo以及参数详解

最近整理一下微服务的文章&#xff0c;先拿一直用的OpenFeign开刀 思考&#xff1a;微服务之间如何方便优雅的实现服务间的远程调用 一、说说openFeign是什么吧&#xff1f; 说到这个&#xff0c;那不得不先说说RPC 1.什么是RPC RPC 全称是 Remote Procedure Call &#x…

程序员还在为兼职接单发愁,快看看这几个宝藏平台吧!!!

在当今经济发展压力巨大的背景下&#xff0c;总有人还在与生活顽强对抗&#xff0c;拿什么和生活对抗嘞&#xff0c;那当然只有马内咯&#xff0c;尤其是对于程序员而言&#xff0c;现在内卷严重&#xff0c;如果能做一点线上兼职搞点马内&#xff0c;那岂不美哉&#xff0c;如…

计算机毕业设计 基于SpringBoot餐厅点餐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Android ANR问题触发机制

1 Anr类型 ​ Anr一般有四种类型。 1.1 input dispatching timeout ​ 主要时按键或触摸屏事件在5s内没有响应。这个时间在ActivityManagerService中定义。 C:\Users\wangjie\AppData\Local\Android\Sdk\sources\android-32\com\android\server\am\ActivityManagerService.…

嵌入式学习 - 用电控制电

目录 前言&#xff1a; 1、继电器 2、二极管 3、三极管 3.1 特殊的三极管-mos管 3.2 npn类型三极管 3.3 pnp类型三极管 3.4 三极管的放大特性 3.5 mos管和三极管的区别 前言&#xff1a; 计算机的工作的核心原理&#xff1a;用电去控制电。 所有的电子元件都有数据手册…

window隐私保护设置(win10)

window隐私保护设置(win10) 1、文件夹选项中&#xff0c;把隐私模块中关于快速访问的选项√去掉 2、个性化中开始模块根据需要关闭需要的选项&#xff0c;最后一个可以关闭任务栏应用历史记录 小尾巴~~ 只要有积累&#xff0c;就会有进步

Multispectral and hyperspectral image fusion in remote sensing: A survey

遥感中的多光谱和高光谱图像融合:一项调查 把融合方法分为:全色锐化、基于分解、基于机器学习;总结了常用数据集和性能评估指标;提出未解决的问题绘制指导方针。 针对这一任务,有叫多光谱与高光谱融合、高光谱超分辨率、高光谱锐化、超锐化 全色锐化相关方法 HS和MS图像…

牛客网Verilog刷题 | 快速入门-基础语法

1、VL1 四选一多路器 描述 制作一个四选一的多路选择器&#xff0c;要求输出定义上为线网类型 状态转换&#xff1a; d0 11 d1 10 d2 01 d3 00 信号示意图&#xff1a; 输入描述&#xff1a; 输入信号 d1,d2,d3,d4 sel 类型 wire 输出描述&#xff1a; 输出信号 mux_ou…

抖音seo优化排名源码搭建

抖音seo优化排名技术开发源码搭建&#xff1a; 思路&#xff1a;看上去比较简单&#xff0c;貌似使用 get、set 这两个 trap 就可以&#xff0c;但实际上并不是。实际上还需要实现 has, ownKeys , getOwnPropertyDescriptor 这些 trap&#xff0c;这样就能最大限度的限制私有属…