QT day4 (time/tcp/draw)

news2024/11/27 0:47:44

如图所示设计一个闹钟

 1、头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QColor>
#include <QDebug>
#include <QMessageBox>
#include <QTimer>                  //定时器类的头文件
#include <QTime>                   //时间类的头文件
#include <QTimerEvent>             //定时器事件处理类
#include <QDateTime>               //日期时间类

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    QDateTime sys_time;
private slots:
    void on_open_clicked();
    
    void on_close_clicked();
    
    void timerEvent(QTimerEvent *e);
    
private:
    Ui::Widget *ui;
    
    //定义一个定时器的标识
    int tid;
    
    int flag=0;
};

#endif // WIDGET_H

2、main函数

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

3、功能函数

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label->setFont(QFont("隶书",28));
    ui->edit->setFont(QFont("隶书",28));
    ui->label_2->setFont(QFont("隶书",28));
    ui->edit_2->setFont(QFont("隶书",30));
    ui->listWidget->setFont(QFont("隶书",28));
    
    //给定时器指针实例化空间
    //  t1 = new QTimer(this);
    tid = this->startTimer(1000);
}

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

void Widget::on_open_clicked()
{
    if(ui->edit->text().toInt()<24&&ui->edit->text().toInt()>=0)
    { if(ui->edit_2->text().toInt()<60&&ui->edit_2->text().toInt()>=0)
        {
            
            ui->open->setEnabled(false);
            ui->close->setEnabled(true);
            ui->edit->setEnabled(false);
            ui->edit_2->setEnabled(false);
            flag=1;
            
        }
    }
    else
    {
        QMessageBox::information(this,"错误","请输入正确的时间格式");
        
    }
    
}

void Widget::on_close_clicked()
{
    ui->close->setEnabled(false);
    ui->open->setEnabled(true);
    ui->edit->setEnabled(true);
    ui->edit_2->setEnabled(true);
    flag=0;
    ui->listWidget->clear();
    
}

//定时器事件处理函数
void Widget::timerEvent(QTimerEvent *e)
{
    if(e->timerId() == tid)
    {
        //        static int num = 1;
        //        ui->eventLab->setNum(num++);
        //获取系统当前的日期时间
        sys_time = QDateTime::currentDateTime();
        
        //将时间展示到ui界面
        ui->label->setText(sys_time.toString("yyyy MM dd ddd hh:mm:ss"));
        
    }
    qDebug()<<sys_time.toString("hh")<<ui->edit->text();
    
    if(flag==1)
    {
        if(ui->edit->text()==sys_time.toString("hh"))
        {
            if(ui->edit_2->text()==sys_time.toString("mm"))
            {
                ui->listWidget->addItem("时间到了");
                flag=0;
            }
        }
    }
}

 

 

TCP

1、服务器

(头文件)

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
#include <QDebug>
#include <QMessageBox>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    
    void newConnection_slot();
    void readyread_slot();
    
private slots:
    void on_bin_clicked();
    
private:
    Ui::Widget *ui;
    
    //定义服务器指针
    QTcpServer *server;
    
    //定义客户端容器,存客户端指针
    QList<QTcpSocket*> clientList;
    
};

#endif // WIDGET_H

 TCP功能函数

#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_bin_clicked()
{
    quint16 port=ui->edit->text().toUInt();
    //进入监听状态
    //参数1:any:监听所有主机
    //参数2:监听端口号,如果是0,表示服务器自动选择
    if(ui->bin->text()=="启动服务器")
    {
        if(server->listen(QHostAddress::Any,port) == true)
        {
            qDebug()<<"监听成功";
            QMessageBox::information(this,"成功","服务器打开成功");
            ui->edit->setEnabled(false);
            ui->bin->setText("关闭服务器");
        }
        else
        {
            qDebug()<<"监听失败";
            QMessageBox::information(this,"失败","服务器打开失败");
        }
        
        connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
    }
    else if(ui->bin->text()=="关闭服务器")
    {
        while(clientList.size()!=0)
        {
            clientList.pop_back();
        }
        server->close();
        ui->edit->setEnabled(true);
        
        ui->bin->setText("启动服务器");
    }
    
}
//槽函数的实现
void Widget::newConnection_slot()
{
    //获取最新链接的客户端套接字
    QTcpSocket *s=server->nextPendingConnection();
    
    //将套接字放入链表
    clientList.push_back(s);
    
    //此时已经成功链接
    //如果客户端发送信号,该客户端会自动发送信号
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyread_slot);
    
    
}

void Widget::readyread_slot()
{
    //清理链表中无效客户端
    for(int i=0; i<clientList.size();i++)
    {
        //找到任意一个客户端
        if(clientList.at(i)->state()==0)
        {
            clientList.removeAt(i);
        }
    }
    
    for(int i=0;i<clientList.size();i++)
    {
        //判断当前有无可读数据
        if(clientList.at(i)->bytesAvailable()==0)
            qDebug()<<"无数据可读";
        else {
            QByteArray msg = clientList.at(i)->readAll();
            ui->qww->addItem(QString::fromLocal8Bit(msg));
            
            for(int j=0;j<clientList.count();j++)
            {
                clientList.at(j)->write(msg);
            }
            
        }
    }
    
}

客户端

(头文件)

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>

#include <QDebug>
#include <QMessageBox>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    
private slots:
    
    void on_pushButton_2_clicked();
    
    void on_pushButton_clicked();
    
    void connected_slot();
    
    void readyread_slot();
    
private:
    Ui::Widget *ui;
    
    QTcpSocket *socket;
    
    QString username;
    
};

#endif // WIDGET_H

功能函数

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit->setPlaceholderText("ip");
    ui->lineEdit_2->setPlaceholderText("port");
    ui->lineEdit_3->setPlaceholderText("请输入你要发送的信息");
    ui->lineEdit_4->setPlaceholderText("用户名");
    
    socket = new QTcpSocket(this);
    
    connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
    
    connect(socket,&QTcpSocket::readyRead,this,&Widget::readyread_slot);
    
}

Widget::~Widget()
{
    delete ui;
}
void Widget::connected_slot()
{
    //qDebug()<<"链接成功";
    QMessageBox::information(this,"成功","链接成功");
    
    QString msg = username + ": 加入群聊";
    ui->pushButton_2->setText("断开链接");
    ui->lineEdit->setEnabled(false);
    ui->lineEdit_2->setEnabled(false);
    ui->lineEdit_4->setEnabled(false);
    
    socket->write(msg.toLocal8Bit());
    
    ui->listWidget->addItem(msg);
    
}

void Widget::readyread_slot()
{
    QByteArray msg = socket->readAll();
    
    ui->listWidget->addItem(QString::fromLocal8Bit(msg));
    
}

void Widget::on_pushButton_2_clicked()
{
    //获取ip,port,用户名
    username = ui->lineEdit_4->text();
    
    QString ip = ui->lineEdit->text();
    
    quint16 port = ui->lineEdit_2->text().toUInt();
    
    
    if(ui->pushButton_2->text()=="链接服务器")
    {
        socket->connectToHost(ip,port);
        
    }
    else if(ui->pushButton_2->text()=="断开链接")
    {
        //
        QString msg = username + ": 离开群聊";
        
        socket->write(msg.toLocal8Bit());
        
        ui->lineEdit->setEnabled(true);
        ui->lineEdit_2->setEnabled(true);
        ui->lineEdit_4->setEnabled(true);
        
        socket->disconnectFromHost();
        
        ui->pushButton_2->setText("链接服务器");
        
    }
    
}

void Widget::on_pushButton_clicked()
{
    //发送
    QString sendmsg = ui->lineEdit_3->text();
    
    sendmsg = username + ": " + sendmsg;
    
    socket->write(sendmsg.toLocal8Bit());
    
    ui->listWidget->addItem(sendmsg);
    
    ui->lineEdit_3->clear();
    
}

效果图

drawer

头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QPoint>
#include <QPainter>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget()override;
    
    //声明要重写的鼠标移动事件
    void mouseMoveEvent(QMouseEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void paintEvent(QPaintEvent *event) override;
    
    
    
private:
    Ui::Widget *ui;
    //定义起始点坐标
    QPoint startPoint;
    //定义一个图像容器
    QPixmap *pix;
};

#endif // WIDGET_H

功能函数

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    pix = new QPixmap(this->size());
    
    pix->fill(Qt::white);
    
}

Widget::~Widget()
{
    delete ui;
}
//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    //定义一个画家,在pix上作画
    QPainter p1(pix);
    
    //定义画笔
    QPen pen(Qt::SolidLine);
    pen.setColor(QColor(53,125,125));
    pen.setWidth(10) ;
    //给画家设置笔
    p1.setPen(pen);
    //画线
    p1.drawLine(startPoint,event->pos());
    
    startPoint=event->pos();
    //更新事件
    this->update();
    
    
    
    
}
//鼠标按压事件
void Widget::mousePressEvent(QMouseEvent *event)
{
    //获取鼠标起始点位置
    startPoint = event->pos();
    this->pix->size() = this->size();
    
}
//绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    
    //定义第二个画家
    QPainter p2(this);
    
    //将p1的图❀到桌面上
    p2.drawPixmap(this->rect(),*pix);
    
    
}

效果图

 

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

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

相关文章

搞定剑桥面试数学题番外篇2:使用多线程并发“加强版”

0. 概览 我们在之前三篇博文中已经介绍了如何用多种语言&#xff08;ruby、swift、c、x64 汇编和 ARM64 汇编&#xff09;实现一道“超超超难”的剑桥数学面试题&#xff1a; 有趣的小实验&#xff1a;四种语言搞定“超超超难”剑桥面试数学题 搞定“超超超难”剑桥面试数学…

【每日挠头算法题(7)】对称的二叉树|二叉树的所有路径

欢迎&#xff01; 前言一、对称的二叉树思路&#xff1a;递归法具体代码如下&#xff1a; 二、二叉树的所有路径思路&#xff1a;递归法具体代码如下&#xff1a; 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不…

如何快速选择合适的会计软件?这些推荐值得尝试!

现今&#xff0c;许多公司都在使用会计软件来管理它们的财务&#xff0c;提高工作效率。因此选择一个适合自己公司的会计软件是相当重要的。但是&#xff0c;对于许多小型企业而言&#xff0c;如何选择最适合自己的会计软件并不容易。那么&#xff0c;该如何选择合适的会计软件…

开启跨平台之旅:学习Flutter,掌握移动应用开发的未来

Flutter是一种开源的移动应用开发框架&#xff0c;由Google开发和维护。它使用Dart语言进行编写&#xff0c;并提供了丰富的UI组件和工具&#xff0c;用于构建高性能、跨平台的移动应用程序。 优势 跨平台开发&#xff1a;Flutter是一种跨平台的移动应用开发框架&#xff0c;…

管理类联考——英语——技巧篇——时态表

一般现在时 1.概念&#xff1a;经常、反复发生的动作或行为及现在的某种状况。 2.基本结构&#xff1a;①is/am/are;②do/does否定形式&#xff1a;①am/is/are not;②此时态的谓语动词若为行为动词&#xff0c;则在其前加don‘t&#xff0c;如主语为第三人称单数&#xff0c…

资深测试总结,性能测试-业务量/吞吐量/存量数据设计关联(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 业务量 是不带时…

HTML | html文档中html和body标签的默认尺寸是多少?

新建一个空白的html文件&#xff0c;如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><title></title><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

day56|动态规划16-编辑距离问题

583. 两个字符串的删除操作 明确dp数组的含义&#xff1a; dp[i][j] 以i-1为结尾的word1和以j-1为结尾的word2&#xff0c;为相同的最小操作次数递归函数&#xff1a; if word1[i-1] word1[j-1]: dp[i][j] dp[i-1][j-1] # 不需要删除&#xff0c;只看上一层的字符串即可 else…

阿里云如何帮助企业进行数据迁移和数据同步?有哪些应用案例?

阿里云如何帮助企业进行数据迁移和数据同步&#xff1f;有哪些应用案例&#xff1f; [本文由阿里云代理商[聚搜云www.4526.cn]撰写] 阿里云数据迁移与数据同步解决方案 阿里云为企业提供了一系列高效、安全并应对不同场景需求的数据迁移与同步服务。这些服务旨在最大范围减少企…

Seata学习 @GlobalTransactional注解的作用

Seata学习 GlobalTransactional注解的作用 1.自动配置类 SeataAutoConfiguration 引入 seata与SpringBoot的整合包后&#xff0c;基于SpringBoot的自动配置&#xff0c;会往Spring容器中自动添加 SeataAutoConfiguration 而 SeataAutoConfiguration 配置类又会往容器中添加be…

基于Java汽车客运站管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

TrafficRoute:一体化的DNS解析和流量调度套件

TrafficRoute是火山引擎推出的解析调度套件&#xff0c;它实现了“一体化”的解析和调度服务&#xff0c;覆盖「公网解析」、「私网解析」、「流量调度/容灾」等场景&#xff0c;提供高性能、高可用、精准、及时、安全和可定制的解析调度产品集。 TrafficRoute具备云解析 DNS、…

华为OD机试真题 JavaScript 实现【字符串通配符】【2022Q4 200分】

一、题目描述 问题描述&#xff1a;在计算机中&#xff0c;通配符一种特殊语法&#xff0c;广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求&#xff1a; 实现如下2个通配符&#xff1a; &#xff1a;匹配0个或以上的字符&#xf…

【一文解决】已安装CUDA与Pytorch但torch.cuda.is_available()为False

目录 问题描述总览&#xff1a;导致问题的原因可能1&#xff1a;CUDA版本与驱动程序不兼容可能2&#xff1a;CUDA库的路径设置存在问题可能3&#xff1a;PyTorch版本与CUDA版本不匹配可能4&#xff1a;编译问题可能5&#xff1a;软件包或库冲突写在最后 问题描述 已经安装CUDA…

2023 陕西省大学生网络安全技能大赛 --- 高职组 Crypto ezmath

文章目录 题目解题过程 题目 from Crypto.Util.number import * from secret import y,a,b flagbflag{} l len(flag) m1, m2 flag[: l // 2], flag[l // 2:]x bytes_to_long(m1) c bytes_to_long(m2)assert (x**21)*(y**21)-2*(xy)*(x*y1)gift-4*x*y 4*b**6-2*a**33*a*c …

JavaScript案例分享:让前端开发者抓狂的按钮

前言 我分享一个前端案例&#xff0c;代码来源我不确定&#xff0c;可能是我某个编程技术交流群的群友分享的。由于我设置了自动下载文件&#xff0c;今天在查看微信文件时偶然发现了这个案例&#xff0c;查看下载日期是6月7日&#xff0c;所以无法确定到底是哪个群友分享的。但…

618,你会入手哪些书?【文末送书】

好书分享 前沿技术人工智能半导体新一代通信与信息技术网络空间安全参与规则 一年一度的618又到啦&#xff01;今年的618就不要乱买啦&#xff0c;衣服买多了会被淘汰&#xff0c;电子产品买多了会过时&#xff0c;零食买多了会增肥&#xff0c;最后怎么看都不划算。可是如果你…

超强整理,性能测试-常用服务器性能指标分析总结,一篇概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 压测过程中&#…

Hive SQL DML

Hive SQL DML 本节所需数据集 数据集 提取码&#xff1a;rkun ⛵加载数据 Load 加载&#xff0c;装载将数据文件移动到与Hive表对应位置&#xff0c;移动时是纯复制&#xff0c;移动操作。纯复制移动指数据load加载到表中&#xff0c;hive不会对表中数据内容进行任何变换&…

Cache技术在星辰处理器中的应用

Cache技术在星辰处理器中的应用-修复MicroPython在MM32F5上启动慢的问题 文章目录 Cache技术在星辰处理器中的应用-修复MicroPython在MM32F5上启动慢的问题引言Cache的工作原理需要关闭DCache的情况鱼和熊掌都想要使用内存保护单元MPU使用内存隔离/同步指令 总结参考文献 引言 …