10月10日

news2024/11/23 21:18:43

hh

绘制

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QMouseEvent>
#include<QPaintEvent>
#include<QPixmap>
#include<QPainter>
#include<QPen>
#include<QColorDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
void  mouseMoveEvent(QMouseEvent *event) override;
void  mousePressEvent(QMouseEvent *event) override;
void  paintEvent(QPaintEvent *event) override;

private slots:
void on_pushButton_clicked();

void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    QPixmap *pix;
    QPoint  startPoint;
    QColor c;
    int pointSize = 3;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include<QInputDialog>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    pix=new QPixmap(this->size());
    pix->fill();
    c=QColor("red");
}

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

void  Widget::mouseMoveEvent(QMouseEvent *event)
{
    QPainter p1(pix);
    QPen pen(QColor("red"));
    pen.setWidth(5);
    p1.setPen(pen);

    p1.drawLine(startPoint,event->pos());

    startPoint=event->pos();

    this->update();
}
void  Widget::mousePressEvent(QMouseEvent *event)
{
    startPoint = event->pos();
}
void  Widget::paintEvent(QPaintEvent *event)
{
    //实例化一个画家
    QPainter p2(this);
    //将pix绘制到ui界面
    p2.drawPixmap(QPoint(0,0),*pix);
}

void Widget::on_pushButton_clicked()
{
    c = QColorDialog::getColor();
}

void Widget::on_pushButton_2_clicked()
{
    pointSize=QInputDialog::getInt(this,"输入线条","请输入");
}

tcp服务器

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
#include<QList>
#include<QMessageBox>
#include<QDebug>
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_serverBtn_clicked();


       void newConnection_slot();              //自定义处理newConnection信号的槽函数的声明
       void readyRead_slot();

private:
    Ui::Widget *ui;
    QTcpServer *server;
    QList<QTcpSocket *>clientList;
};
#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);
   connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);
}
Widget::~Widget()
{
    delete ui;
}







void Widget::on_serverBtn_clicked()
{
    if(ui->serverBtn->text() == "启动服务器")
       {
           //启动服务器逻辑
           //获取ui界面上的端口号
           quint16 port = ui->portEdit->text().toUInt();


           //启动监听
           //函数原型:bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);、
           //参数1:要监听的ip地址,QHostAddress::Any表示监听任意一台主机
           //参数2:服务器的端口号,如果填0表示让系统自动分配端口号
           //返回值:成功监听返回真(成功启动服务器),否则返回假
           if(!server->listen(QHostAddress::Any, port))
           {
               QMessageBox::information(this,"提示","服务器启动失败");
               return ;
           }else
           {
               QMessageBox::information(this,"提示","服务器启动成功");
           }


           //程序执行至此,表示服务器已经启动了,此时如果有客户端向服务器发来连接请求,那么该服务器就会自动发射一个newConnection的信号
           //我们可以将该信号连接到自定义的槽函数中执行相关逻辑,由于连接只需要一次,我们可以写在构造函数中




           //更新按钮文本内容
           ui->serverBtn->setText("关闭服务器");
       }else
       {
           //关闭服务器逻辑
           server->close();


           //更新按钮文本内容
           ui->serverBtn->setText("启动服务器");
       }
}

void Widget::newConnection_slot()
{
    //QMessageBox::information(this, "提示", "有新客户发来连接请求了");
    qDebug() << "有新客户端发来连接请求";


    //获取最新连接的客户端套接字
    //函数原型:QTcpSocket *nextPendingConnection();
    //参数:无
    //返回值:最新连接的套接字的地址
    QTcpSocket* s = server->nextPendingConnection();


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


    //程序执行至此,一个服务器和多个客户端就已经建立了连接
    //当某个客户端向服务器发送消息后,该套接字就会自动发射一个readyRead信号
    //我们可以将该信号连接到自定义的槽函数中执行相关逻辑
    connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
}

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

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

相关文章

“ORA-01017(:用户名/口令无效; 登录被拒绝)”解决办法

目录 报错&#xff1a;ORA-01017&#xff08;&#xff1a;用户名/口令无效; 登录被拒绝&#xff09; 1.打开CMD命令窗&#xff0c;输入sqlplus / as sysdba 1&#xff09;修改密码 SQL>alter user 用户名 identified by 密码 alter user system identified by manager;2&…

27.数据结构与算法-图的遍历(DFS,BFS)

遍历定义与遍历实质 图的特点 图的常用遍历方法 深度优先搜索-DFS 邻接矩阵表示的无向图深度遍历实现 DFS算法效率分析 非连通图的遍历 广度优先搜索遍历-BFS 邻接表表示的无向图广度遍历实现 BFS算法效率分析 非连通图的广度遍历 DFS和BFS算法效率比较

多线程-初阶(2)BlockingQueueThreadPoolExecutor

学习目标&#xff1a; 熟悉wait和notify的线程休眠和启动 熟悉多线程的基本案例 1.单例模式的两种设置模式:懒汉模式和饿汉模式 2.阻塞队列(生产者消费者模型) 3.线程池 4.定时器 1.wait和notify 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是…

Kotlin顶层属性

kotlin顶层属性 属性可以单独放在一个文件中 file:JvmName("TestValue") // 指定顶层函数生成的类名, 如果不主动声明&#xff0c;默认&#xff08;当前文件名Kt&#xff09;var test_var 1val test_val 2const val test_const_val 3对应生成的java代码如下: 可…

grafana version 11.1.0 设置Y轴刻度为1

grafana 版本 # /usr/share/grafana/bin/grafana --version grafana version 11.1.0设置轴 Axis 搜索 Standard options 在"Decimals"中输入0&#xff0c;确保只显示整数

Kafka 的 Producer 如何实现幂等性

在分布式系统中&#xff0c;消息队列 Kafka 扮演着重要的角色。而确保 Kafka 的 Producer&#xff08;生产者&#xff09;的消息发送具有幂等性&#xff0c;可以极大地提高系统的可靠性和稳定性。那么&#xff0c;Kafka 的 Producer 是如何实现幂等性的呢&#xff1f;让我们一起…

Excel多级结构转成树结构形式

第一步&#xff1a;Excel文件的形式如下 第二步&#xff1a;转换成树结构可选形式 第三步&#xff1a;具体怎么实现&#xff1f; &#xff08;1&#xff09;、需要借助数据库中表来存储这些字段&#xff0c;一张表&#xff08;aa&#xff09;存Excel文件中的所有数据&#xff…

算法复杂度 (数据结构)

一. 数据结构前言 1.1 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用&#xff0c;所以我们要学各式各样的数据结构&#xff0c;如&#xff1…

如何选择医疗器械管理系统?盘谷医疗符合最新版GSP要求

去年12月7日&#xff0c;新版《医疗器械经营质量管理规范》正式发布&#xff0c;并于今年7月1日正式实施。新版GSP第五十一条提出“经营第三类医疗器械的企业&#xff0c;应当具有符合医疗器械经营质量管理要求的计算机信息系统&#xff0c;保证经营的产品可追溯”&#xff0c;…

Python的functools模块完全教程

在python中函数是一等公民。Java中则为类是一等公民。 当一个函数将另一个函数作为输入或返回另一个函数作为输出时&#xff0c;这些函数称为高阶函数。 functools模块是Python的标准库的一部分&#xff0c;它是为高阶函数而实现的&#xff0c;用于增强函数功能。 目录 一、…

k8s部署及安装

1.1、Kubernetes 简介及部署方法 在部署应用程序的方式上面&#xff0c;主要经历了三个阶段 传统部署:互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点:简单&#xff0c;不需要其它技术的参与 缺点:不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计算…

量化交易四大邪术终章:春梦了无痕

做量化交易有些年头了&#xff0c;见过的策略也成百上千了&#xff0c;前段时间突发奇想&#xff0c;想揭露一些“照骗”策略&#xff0c;尽自己所能减少一些上当受骗的人数&#xff0c;于是写了一个量化邪术系列。 为什么叫量化交易邪术呢&#xff1f;因为在古早的简中网络中&…

netdata保姆级面板介绍

netdata保姆级面板介绍 基本介绍部署流程下载安装指令选择设置KSM为什么要启用 KSM&#xff1f;如何启用 KSM&#xff1f;验证 KSM 是否启用注意事项 检查端口启动状态 netdata和grafana的区别NetdataGrafananetdata各指标介绍总览system overview栏仪表盘1. CPU2. Load3. Disk…

TreeMap和TreeSet

前言 在了解TreeSet和TreeMap之前&#xff0c;先让我们介绍一下搜索树的概念。 1. 搜索树 二叉搜索树又称二叉排序树&#xff0c;这颗树要么是一棵空树&#xff0c;要么是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节…

[Qt] 信号与槽:深入浅出跨UI与跨线程的信号发送

文章目录 如何自定义信号并使用自定义信号的步骤1.使用 signals 声明信号2. 信号的返回值是 void3. 在需要发送信号的地方使用 emit4. 使用 connect 链接信号和槽5. 完整代码示例总结 如何跨UI发送信号Qt跨UI发送信号机制详解案例概述Qt 信号与槽机制简介代码逻辑详解主窗口 Wi…

九APACHE

## 一 、HTTP协议与URL * HTTP协议&#xff1a;超文本传输协议&#xff0c;用于从Web服务器传输超文本到本地浏览器的传输协议&#xff0c;属于应用层协议。 超文本语言&#xff0c;用来创建超文本文件的标签 * URL&#xff1a;统一资源定位符&#xff0c;是互联网上标准资源…

centos 8.4学习小结

1.权限委派 2.vim快捷方式 2.1非正常关闭文本处理方式 2.2快捷方式 2.3TAB键补齐安装包 [ rootcloud Packages]# rpm -ivh bash-completion-2.7-5.el8.noarch.rpm 2.4#history 查询历史记录 [rootcloud ~]# vim /etc/profile HISTSIZE1000&#xff08;默认保存1000条历史记…

基于SSM的老年人身心健康监管平台

文未可获取一份本项目的java源码和数据库参考。 选题意义 21世纪是全球人口老龄化的时代。联合国经济和社会事务部人口司发布的统计数据显示&#xff0c;截止到2018年7月,全球60岁及以上人口约为9.62亿&#xff0c;占总人口的比重约为12.8%。2018年底&#xff0c;我国60岁及以…

需求11——解决字段无法清空的两个小bug

目录 背景 第一个小bug——问题阐述 第一个小bug——解决方案 第二个小bug——问题阐述 第二个小bug——解决方案 总结 背景 已经写了一个上午的文章了&#xff0c;写完这篇就可以去吃饭了。这也是这几个月的我写的最后一个小bug文章&#xff0c;把这篇文章写完就搞定了…

vue 数组变化侦测

变更方法 Vue 能够侦听响应式数组的变更方法&#xff0c;并在它们被调用时触发相关的更新。这些变更方法包括: push() pop() shift() unshift() splice() sort() reverse() <template><div><p>点击按钮为列表添加元素</p><button click"cli…