QTday4(事件处理核心机制、定时器、绘制事件)

news/2024/7/16 8:12:35 标签: qt, 命令模式, myeclipse, ide, java

一、Xmind整理:

二、上课笔记整理:

1.使用鼠标事件完成组件的移动

头文件: 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QDebug>
#include<QMouseEvent>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void mousePressEvent(QMouseEvent *event) override;          //鼠标按下事件
    void mouseMoveEvent(QMouseEvent *event) override;            //鼠标移动事件

private:
    Ui::Widget *ui;

    QPoint drap;       //定义Z向量
};
#endif // WIDGET_H

源文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QDebug>
#include<QMouseEvent>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void mousePressEvent(QMouseEvent *event) override;          //鼠标按下事件
    void mouseMoveEvent(QMouseEvent *event) override;            //鼠标移动事件

private:
    Ui::Widget *ui;

    QPoint drap;       //定义Z向量
};
#endif // WIDGET_H

2.基于属性版本的定时器(QTimer)

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

3.定时器案例

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTimer>          //定时器类
#include<QTime>           //时间类

#include<QTimerEvent>        //定时器事件类头文件
#include<QDateTime>           //日期时间类

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    //重写定时器事件处理函数
    void timerEvent(QTimerEvent *event)override;

private slots:
    void on_objStartBtn_clicked();

    void timeout_slot();           //自定义处理timeout信号函数的声明

    void on_eventStartBtn_clicked();

private:
    Ui::Widget *ui;

    //实例化一个定时器指针。基于类对象版本的定时器
    QTimer *timer;

    //定义一个定时器的id
    int timer_id;             //基于事件处理函数的定时器
};
#endif // WIDGET_H

源文件:

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

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

    //实例化一个定时器
    timer = new QTimer(this);
    //将该定时器的timeout信号连接到自定义的槽函数中
    connect(timer, &QTimer::timeout, this, &Widget::timeout_slot);
}

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

//基于属性的按钮对应的槽函数
void Widget::on_objStartBtn_clicked()
{
    if(ui->objStartBtn->text() == "启动")
    {
        //启动定时器
        timer->start(1000);    //从此时起,该定时器会每隔1秒的时间发射一个timeout的信号

        //将按钮的文本内容改成“关闭”
        ui->objStartBtn->setText("关闭");
    }else
    {
        //关闭定时器
        timer->stop();

        //将按钮文本内容改为“启动”
        ui->objStartBtn->setText("启动");
    }
}

//处理timeout信号对应的槽函数
void Widget::timeout_slot()
{
//    static int num = 0;
//    ui->objTimeLab->setNum(++num);

    //调用QTime的静态成员函数获取当前系统时间
    QTime sys_time = QTime::currentTime();

    //获取时分秒
//    int hour = sys_time.hour();
//    int minute = sys_time.minute();
//    int sec = sys_time.second();

    //将时间类对象调用函数转换为字符串
    QString t = sys_time.toString("hh:mm:ss");

    //将时间展示到ui界面的lab中
    ui->objTimeLab->setText(t);

    ui->objTimeLab->setAlignment(Qt::AlignCenter);         //标签文本对齐方式
    ui->objTimeLab->setFont(QFont("微软雅黑", 20));
}

/**********************************************************************************/

void Widget::on_eventStartBtn_clicked()
{
    if(ui->eventStartBtn->text() == "启动")
    {
        //启动一个定时器
        //函数原型:int startTimer(int interval);
        //功能:启动一个定时器,并返回该定时器的id
        //参数:定时器的时长,一毫秒为单位
        //返回值:启动的该定时器的id号

        timer_id = this->startTimer(1000);

        //将按钮文本内容改为“关闭”
        ui->eventStartBtn->setText("关闭");
    }else
    {
        //关闭一个定时器
        //函数原型:void killTimer(int id);
        //参数:要关闭的定时器的id号
        //返回值:无
        this->killTimer(timer_id);

        //将按钮文本内容改为"启动"
        ui->eventStartBtn->setText("启动");
    }
}

//定时器事件处理函数的实现
void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == timer_id)
    {
//        static int num = 0;
//        ui->eventTimeLab->setNum(++num);
        QDateTime sys_dt = QDateTime::currentDateTime();      //获取当前系统的日期时间

        //展示时间到ui界面
        ui->eventTimeLab->setText(sys_dt.toString("yyyy-MM-dd hh:mm:ss"));

    }
}

4.绘制事件(QPaintEvent)

头文件:

#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include<QPaintEvent>           //绘制事件类
#include<QDebug>
#include<QPainter>          //画家类

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    //重写绘制事件处理函数
    void paintEvent(QPaintEvent *event) override;

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

源文件:

#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)
{
    //实例化一个画家类
    QPainter maliang(this);

    //定义画笔
    QPen pen;
    pen.setColor("pink");      //设置画笔颜色
    pen.setWidth(10);              //设置字体粗细
    pen.setStyle(Qt::SolidLine);        //线性为实线

    //给画家安排上画笔
    maliang.setPen(pen);

    //给画家设置字体
    maliang.setFont(QFont("楷体", 40));

    //绘制矢量文字
    maliang.drawText(this->rect(), Qt::AlignCenter, "好好学习,天天向上");

    /******************************************************************/
    pen.setColor("skyblue");            //设置画笔的颜色
    pen.setStyle(Qt::DashDotDotLine);    //设置画笔的线型

    maliang.setPen(pen);

    maliang.drawRect(20,20,this->width()-40, this->height()-40);

    /*****************************************************************/
    pen.setColor("purple");
    pen.setWidth(20);
    pen.setStyle(Qt::SolidLine);
    maliang.setPen(pen);
    maliang.setBrush(QBrush("green"));

    //偏移起始点坐标
    maliang.translate(this->width()/2, this->height()/2);

    //偏移正方向
    maliang.rotate(45);

    //画椭圆
    maliang.drawEllipse(QPoint(0,0), 150, 100);

}

5.画板的案例

头文件:

#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include<QMouseEvent>          //鼠标事件
#include<QPaintEvent>           //绘制事件
#include<QPainter>              //画家类
#include<QPixmap>                //图像容器


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void mousePressEvent(QMouseEvent *event) override;         //鼠标按下事件
    void mouseMoveEvent(QMouseEvent *event) override;            //鼠标移动事件
    void paintEvent(QPaintEvent *event) override;               //绘制事件

private:
    Ui::Widget *ui;

    //准备一个膜
    QPixmap *pix;

    //定义用户的绘制起始点
    QPoint startPoint;
};
#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::mousePressEvent(QMouseEvent *event)
{
    //获取起始点
    startPoint = event->pos();         //将鼠标当前的位置作为起始点
}

//鼠标移动事件处理函数
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    //定义一个画家,在膜上面作画
    QPainter p1(pix);

    //准备画家的画笔
    QPen pen(QColor("red"));
    pen.setWidth(3);

    p1.setPen(pen);        //设置画笔颜色

    //两点之间开始画直线
    p1.drawLine(startPoint, event->pos());         //从起始点到鼠标现在所在位置绘制一条直线
    //更新起始点
    startPoint = event->pos();

    //调用update函数,刷新一下界面
    this->update();
}

//绘制事件处理函数的定义
void Widget::paintEvent(QPaintEvent *event)
{
    //定义一个画家,在组件上作画
    QPainter p2(this);

    //将膜上的绘制的图像更新到组件上
    p2.drawPixmap(this->rect(), *pix);
}

http://www.niftyadmin.cn/n/4999610.html

相关文章

【计算机组成 课程笔记】2.1 设计自己的计算机

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 2 - 1 - 201-设计自己的计算机&#xff08;14‘24’‘&#xff09;_哔哩哔哩_bilibili 什么是指令系统体系结构&#xff1f;这个问题其实非常简单&#xff0c;但要想解释清楚也没有那么容易。我们还是从一个小故事…

大数据成为市场营销利器 ,促进金融贷款企业获客精准化

随着大数据技术的不断普及&#xff0c;中国对尖端技术和云计算技术的投资大幅增加。大数据、云计算技术、物联网等一系列新一代信息技术也加速完善。 目前&#xff0c;大数据技术也非常成熟&#xff0c;大数据的应用领域也多种多样。大数据的重要方面“运营商大数据”已经被政…

Debian离线安装mysql

PS:虽然已经分享了很多安装各种环境订的教程&#xff0c;但是每个客户的环境不一样&#xff0c;那就得重新来一次&#xff0c;其实都是大同小异的&#xff0c;但是里面其实也是存在不少坑的&#xff0c;今天我们就来安装一个新的东西&#xff0c;Debian 11离线安装mysql,为什么…

设计模式概念学习

创建类型 单例模式 饿汉 构建时就创建 懒汉 单线程-访问到的时候才创建多线程-低效率 做法&#xff1a;加锁->若未创建则创建->获取资源->解锁 缺点&#xff1a;效率低&#xff0c;每次访问之前都要加锁&#xff0c;资源创建之后不能被同时被多个线程访问多线程-…

人体呼吸存在传感器成品,毫米波雷达探测感知技术,引领智能家居新潮流

随着科技的不断进步和人们生活质量的提高&#xff0c;智能化家居逐渐成为一种时尚和生活方式。 人体存在传感器作为智能家居中的重要组成部分&#xff0c;能够实时监测环境中人体是否存在&#xff0c;为智能家居系统提供更加精准的控制和联动。 在这个充满创新的时代&#xf…

深入理解联邦学习——联邦学习与现有理论的区别与联系

分类目录&#xff1a;《深入理解联邦学习》总目录 作为一种全新的技术&#xff0c;联邦学习在借鉴一些成熟技术的同时也具备了一定的独创性。下面我们就从多个角度来阐释联邦学习和其他相关概念之间的关系。 联邦学习与差分隐私理论的区别 联邦学习的特点使其可以被用来保护用…

云原生周刊:Linkerd 发布 v2.14 | 2023.9.4

开源项目推荐 Layerform Layerform 是一个 Terraform 包装器&#xff0c;可帮助工程师使用纯 Terraform 文件构建可重用的基础设施。 为了实现重用&#xff0c;Layerform 引入了层的概念。每层都包含一些基础设施&#xff0c;并且可以堆叠在另一层之上。 除了更易于使用之外…

微信小程序slot插槽的介绍,以及如何通过uniapp使用动态插槽

微信小程序文档 - slots介绍 由上述文档看俩来&#xff0c;微信小程序官方并没有提及动态插槽内容。 uniapp文档 - slots介绍 uni官方也未提及关于动态插槽的内容 在实际使用中&#xff0c;直接通过 <<slot :name"item.xxx" /> 这种形式会报错&#xff…