QT day4 (time/tcp/draw)

这篇具有很好参考价值的文章主要介绍了QT day4 (time/tcp/draw)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如图所示设计一个闹钟

QT day4 (time/tcp/draw)

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

QT day4 (time/tcp/draw)

QT day4 (time/tcp/draw)

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

效果图

QT day4 (time/tcp/draw)

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

效果图

QT day4 (time/tcp/draw)文章来源地址https://www.toymoban.com/news/detail-485642.html

到了这里,关于QT day4 (time/tcp/draw)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT】Day4

    1 思维导图 2 手动完成服务器的实现,并具体程序要注释清楚  widget.h widget.cpp  

    2024年02月15日
    浏览(36)
  • Qt : day4

    1.思维导图  2.服务器  3.时钟  

    2024年02月15日
    浏览(39)
  • QT DAY4

    做一个闹钟,并播报填写内容  widget.h 文件  widget.cpp文件 实现效果         在没有点击启动按钮时,时间和信息都可以修改,点击关闭按钮无效。          信息和时间填写完后,点击启动按钮后,启动按钮被锁定,时间框和信息框无法再修改内容,只有关闭按钮可以点

    2024年02月13日
    浏览(36)
  • QT DAY4作业

    1. 头代码 源代码 效果图 2.思维导图

    2024年02月02日
    浏览(53)
  • QT 作业 day4 7/28

    1.思维导图     2.手动完成服务器实现 .h .cpp

    2024年02月15日
    浏览(53)
  • 嵌入式:QT Day4

    源码: widget.h widget.cpp main.cpp

    2024年02月14日
    浏览(41)
  • qt图形化界面开发DAY4

    2024年01月23日
    浏览(34)
  • DAY4,Qt(事件处理机制的使用,Qt中实现服务器的原理)

    ---chatser.h---头文件 ---chatser.cpp---函数实现文件 ---main.cpp---测试文件 结果展示---     

    2024年02月15日
    浏览(57)
  • 97-TCP为什么要有一个“TIME_WAIT“的状态

    \\\"TIME_WAIT\\\"状态存在的原因主要有两点: 假设上图中用于确认服务器结束报文段6的TCP报文段7丢失,那么服务器将重发结束报文段,因此客户端需要停留在某个状态以处理重复收到的结束报文段.否则客户端将以复位报文段来回应服务器,服务器则认为这是一个错误,因为他期望的是一

    2024年02月01日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包