前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备

QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备

原创
作者头像
Arya
发布2024-11-06 09:54:26
发布2024-11-06 09:54:26
1950
举报
文章被收录于专栏:后端开发专栏后端开发专栏

引出


QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备

QT中的鼠标事件

定义QLable的鼠标进入离开事件

注意这里的QWidget后面要改成QLabel

代码语言:java
复制
#include "mylabel.h"
#include <QDebug>

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}


// 鼠标进入
void myLabel::enterEvent(QEvent *event)
{
    qDebug() << "鼠标进入了";
}

// 鼠标离开
void myLabel::leaveEvent(QEvent *)
{
    qDebug() << "鼠标离开了";
}

提升为myLabel

重写QLabel的函数

鼠标的事件

基于控件的

鼠标的左中右键枚举

鼠标多事件获取和鼠标移动

头文件

代码语言:java
复制
#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

class myLabel : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = nullptr);

    // 鼠标进入
    void enterEvent(QEvent *event);

    // 鼠标离开
    void leaveEvent(QEvent *);

    // 鼠标放下和释放
    virtual void mousePressEvent(QMouseEvent *ev);
    virtual void mouseReleaseEvent(QMouseEvent *ev);

    // 鼠标的移动
    virtual void mouseMoveEvent(QMouseEvent *ev);

signals:

};

#endif // MYLABEL_H

cpp文件

代码语言:java
复制
#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}


// 鼠标进入
void myLabel::enterEvent(QEvent *event)
{
//    qDebug() << "鼠标进入了";
}

// 鼠标离开
void myLabel::leaveEvent(QEvent *)
{
//    qDebug() << "鼠标离开了";
}

// 鼠标放下和释放
void myLabel::mousePressEvent(QMouseEvent *ev)
{

    // 鼠标左键按下打印
    if(ev->button() == Qt::LeftButton){
        QString str = QString("鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4")
                .arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
    }

}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    qDebug() << "鼠标释放";
}

// 鼠标的移动
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
    if(ev->buttons() & Qt::LeftButton)
    {
        qDebug() << "鼠标移动";
    }
}

鼠标追踪

定时器事件

QTimerEvent

代码语言:java
复制
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

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

    int id1; // 定时器1的唯一标识
    int id2; // 定时器2的唯一标识

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
代码语言:java
复制
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 启动定时器
    // 参数1 间隔 单位 毫秒
    id1 = startTimer(1000);

    id2 = startTimer(2000);
}

void Widget::timerEvent(QTimerEvent * ev)
{
    if(ev->timerId()==id1){
        static int num =1;
        // label1 每间隔1秒
        ui->label_2->setText(QString::number(num++));
    }

    // label2 每间隔2s
    if(ev->timerId()==id2){
        static int num2 = 1;
        ui->label_3->setText(QString::number(num2++));
    }


    // label3 每间隔3s

}


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

QTimer

代码语言:java
复制
#include "widget.h"
#include "ui_widget.h"
#include <QTimer> // 定时器的类

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 启动定时器
    // 参数1 间隔 单位 毫秒
    id1 = startTimer(1000);
    id2 = startTimer(2000);

    // 定时器的第二种方式,实例化,加到对象树上
    QTimer *timer = new QTimer(this);
    //  启动定时器
    timer->start(500); // 每隔500ms

    connect(timer,&QTimer::timeout,
            [=](){
        static int num = 1;
        ui->label_4->setText(QString::number(num++));
    });

    // 点击暂停按钮,停止定时器
    connect(ui->btnStop,&QPushButton::clicked,
            [=](){
        timer->stop();
    });

}

void Widget::timerEvent(QTimerEvent * ev)
{
    if(ev->timerId()==id1){
        static int num =1;
        // label1 每间隔1秒
        ui->label_2->setText(QString::number(num++));
    }

    // label2 每间隔2s
    if(ev->timerId()==id2){
        static int num2 = 1;
        ui->label_3->setText(QString::number(num2++));
    }


    // label3 每间隔3s

}


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

事件的分发

静态类型转换方法

代码语言:java
复制
bool myLabel::event(QEvent *e)
{
    // 如果是鼠标按下,在event事件分发中做拦截操作
    if(e->type()==QEvent::MouseButtonPress)
    {
        QString str1 = QString("鼠标按下了,在event事件分发中处理");
        qDebug() << str1;

        // 需要进行类型转换
        QMouseEvent * ev = static_cast<QMouseEvent *>(e);
        QString str = QString("鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4")
                .arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
        return true; // 代表用户自己处理,不向下分发
    }

    // 其他事件,交给父类处理,默认处理
    return QLabel::event(e);
}

事件过滤器

这里有两个参数,obj 和 e,一个用于判断控件,另一个用来判断事件

代码语言:java
复制
#include "widget.h"
#include "ui_widget.h"
#include <QTimer> // 定时器的类
#include <QDebug>
#include <QMouseEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 启动定时器
    // 参数1 间隔 单位 毫秒
    id1 = startTimer(1000);
    id2 = startTimer(2000);

    // 定时器的第二种方式,实例化,加到对象树上
    QTimer *timer = new QTimer(this);
    //  启动定时器
    timer->start(500); // 每隔500ms

    connect(timer,&QTimer::timeout,
            [=](){
        static int num = 1;
        ui->label_4->setText(QString::number(num++));
    });

    // 点击暂停按钮,停止定时器
    connect(ui->btnStop,&QPushButton::clicked,
            [=](){
        timer->stop();
    });

}

void Widget::timerEvent(QTimerEvent * ev)
{
    if(ev->timerId()==id1){
        static int num =1;
        // label1 每间隔1秒
        ui->label_2->setText(QString::number(num++));
    }

    // label2 每间隔2s
    if(ev->timerId()==id2){
        static int num2 = 1;
        ui->label_3->setText(QString::number(num2++));
    }

    // 给label1安装事件过滤器
    // 步骤1:安装事件的过滤器
    ui->label->installEventFilter(this);
}


bool Widget::eventFilter(QObject * obj, QEvent * e){
    if(obj == ui->label){
        if(e->type() == QEvent::MouseButtonPress){
            QMouseEvent * ev = static_cast<QMouseEvent *>(e);
            QString str = QString("事件过滤器===鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4")
                    .arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
            qDebug() << str;
            return true;
        }
    }

    // 其他默认处理
    return QWidget::eventFilter(obj,e);

}


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

绘图学习

新建一个项目

新建一个窗口应用程序

选择MinGW32

使用初体验

画笔颜色设置

画笔类型设置

画刷的使用

代码

代码语言:java
复制
void Widget::paintEvent(QPaintEvent *event){
    // 实例化画家对象
    QPainter painter(this); // this指定的是绘图设备

    // 设置画笔
    QPen pen(QColor(255,0,0));
    pen.setWidth(2);
    pen.setStyle(Qt::DotLine);

    // 让画家使用笔
    painter.setPen(pen);


    // 设置画刷
    QBrush brush(Qt::cyan);
    brush.setStyle(Qt::Dense7Pattern);

    //画家使用画刷
    painter.setBrush(brush);

    // 线
    painter.drawLine(QPoint(0,0),QPoint(100,100));

    // 画一个圆
    painter.drawEllipse(QPoint(100,100),100,50); // 椭圆

    // 画一个矩阵
    painter.drawRect(QRect(20,20,50,50));

    // 画文字
    painter.drawText(QRect(10,200,200,50),"好好学习,天天吃饭");

}

高级设置

抗锯齿

代码语言:java
复制
    painter.drawEllipse(QPoint(100,100),50,50);
    // 设置抗锯齿能力,效率低
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(200,100),50,50);

画家移动

代码语言:java
复制
    painter.drawRect(QRect(20,20,50,50));

    // 移动画家
    painter.translate(100,0);
    painter.drawRect(QRect(20,20,50,50));

状态保存和还原

代码语言:java
复制
    ////////////////// 高级的设置 ///////////////////////////
    QPainter painter(this); // this指定的是绘图设备
//    painter.drawEllipse(QPoint(100,100),50,50);
//    // 设置抗锯齿能力,效率低
//    painter.setRenderHint(QPainter::Antialiasing);
//    painter.drawEllipse(QPoint(200,100),50,50);

    painter.drawRect(QRect(20,20,50,50));

    // 移动画家
    painter.translate(100,0);

    // 保存画家状态
    painter.save();

    painter.drawRect(QRect(20,20,50,50));

    painter.translate(100,0);

    // 还原画家的保存状态
    painter.restore();

    painter.drawRect(QRect(20,20,50,50));

画家画图片

插曲:如何添加图片资源

右键,添加新文件

右键,open in Editor

进行绘图

点击按钮图片右移

代码语言:java
复制
int posX = 0; // 横坐标默认是0,每次点击右移
代码语言:java
复制
    ////////////////// 画家画图片 ////////////////
    QPainter painter(this); // this指定的是绘图设备
    // 如果超出屏幕,从0开始
    if(posX > this->width()){
        posX = 0;
    }
    painter.drawPixmap(posX,0,QPixmap(":/OtherSceneBg.png"));

绘图设备

QPixmap使用初体验

代码语言:java
复制
#include "widget.h"
#include "ui_widget.h"

#include <QPixmap>
#include <QPainter>

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

    // pixmap绘图设备
    QPixmap pix(300,300);

    // 声明画家
    QPainter painter(&pix);
    painter.setPen(QPen(Qt::green));

    painter.drawEllipse(QPoint(150,150),100,100);

    // 保存
    pix.save("./qtpix.png");
}

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

修改填充颜色

代码语言:java
复制
    // 修改填充颜色
    pix.fill(Qt::white);

QImage 绘图设备

代码语言:java
复制
    // QImage的使用

    QImage img(300,300,QImage::Format_RGB32);
    img.fill(Qt::gray);

    // 声明画家,画家在 img 中画
    QPainter painter(&img);
    painter.setPen(QPen(Qt::red));

    painter.drawEllipse(QPoint(150,150),100,100);

    // 保存
    img.save("./img.png");

对像素进行修改

代码语言:java
复制
void Widget::paintEvent(QPaintEvent *){

    QPainter painter(this);

    // 利用QImage 对像素进行修改
    QImage img;
    img.load(":/Image/OtherSceneBg.png");

    // 画之前修改像素点
    for(int i=50;i<100;i++){
        for(int j=50;j<100;j++){
            QRgb value = qRgb(255,0,0);
            img.setPixel(i,j,value);
        }
    }

    painter.drawImage(0,0,img);

}

QPicture 绘图设备,记录和重现

代码语言:java
复制
    // QPicture 绘图设备,可以记录和重现绘图指令
    QPicture pic;
    QPainter painter;

    painter.begin(&pic); // 开始进行画图
    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150,150),100,100);
    painter.end();       // 画图结束

    // 保存
    pic.save("./pic.wj");

绘图的重绘

代码语言:java
复制
    // 进行重现
    QPainter painter(this);
    QPicture pic;
    pic.load("./pic.wj");

    painter.drawPicture(0,0,pic);

总结

QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引出
  • QT中的鼠标事件
    • 定义QLable的鼠标进入离开事件
    • 提升为myLabel
    • 重写QLabel的函数
      • 鼠标的事件
      • 鼠标的左中右键枚举
      • 鼠标多事件获取和鼠标移动
      • 鼠标追踪
  • 定时器事件
    • QTimerEvent
    • QTimer
  • 事件的分发
    • 事件过滤器
  • 绘图学习
    • 新建一个项目
    • 使用初体验
      • 画笔颜色设置
      • 画笔类型设置
      • 画刷的使用
      • 代码
    • 高级设置
      • 抗锯齿
      • 画家移动
      • 状态保存和还原
    • 画家画图片
      • 插曲:如何添加图片资源
      • 进行绘图
      • 点击按钮图片右移
  • 绘图设备
    • QPixmap使用初体验
      • 修改填充颜色
    • QImage 绘图设备
      • 对像素进行修改
    • QPicture 绘图设备,记录和重现
      • 绘图的重绘
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档