lv20 QT事件5

1 事件模型

2 事件处理

virtual void 	keyPressEvent(QKeyEvent *event)
virtual void 	keyReleaseEvent(QKeyEvent *event)
virtual void 	mouseDoubleClickEvent(QMouseEvent *event)
virtual void 	mouseMoveEvent(QMouseEvent *event)
virtual void 	mousePressEvent(QMouseEvent *event)
virtual void 	mouseReleaseEvent(QMouseEvent *event)
virtual void 	moveEvent(QMoveEvent *event)
virtual void 	paintEvent(QPaintEvent *event)
virtual void 	resizeEvent(QResizeEvent *event)
virtual void 	wheelEvent(QWheelEvent *event)

2.1 事件综合示例

  • mousePressEvent:处理鼠标按下事件,输出鼠标位置信息。
  • mouseMoveEvent:处理鼠标移动事件,输出鼠标位置信息。
  • keyPressEvent:处理键盘按下事件,输出按下的键值。
  • wheelEvent:处理鼠标滚轮事件,输出滚轮滚动距离。
  • timerEvent:处理定时器事件,输出定时器事件信息。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QWheelEvent>

class Widget : public QWidget
{
    Q_OBJECT

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

    void mousePressEvent(QMouseEvent *event)
    {
        qDebug()<<"pressssss: "<<event->pos();

    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        qDebug()<<"moving!"<<event->pos();
    }

    void keyPressEvent(QKeyEvent *event)
    {
        qDebug()<<"key: "<<event->key();
    }

    void wheelEvent(QWheelEvent *event)
    {
        qDebug()<<"wheel: "<<event->delta();
    }

    void timerEvent(QTimerEvent *event)
    {
        qDebug()<<"timer!";
    }
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    startTimer(1000);
}

Widget::~Widget()
{

}

2.2 绘图事件

virtual void paintEvent(QPaintEvent *event)
{ 
    if(isDrawing)  {  
	 tempPix = pix;       //双缓冲     
	QPainter pp(&tempPix);  
	painter.drawPixmap(0,0,tempPix);  
    }  
    else {  
	QPainter pp(&pix);  
	painter.drawPixmap(0,0,pix);  
    }  
}

绘制时钟示例 

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT  // 使用 Q_OBJECT 宏,以便能够使用 Qt 的信号和槽机制

public:
    Widget(QWidget *parent = 0);  // 构造函数
    ~Widget();  // 析构函数
    void paintEvent(QPaintEvent *event)  // 重载 paintEvent 方法,用于绘制图形
    {
        qDebug()<<"ppppppp";  // 输出调试信息

        QPainter p(this);  // 创建 QPainter 对象并将当前窗口部件作为绘图设备

        p.translate(this->width()/2, this->height()/2);  // 将坐标系平移到窗口中心
        p.drawEllipse(QPoint(0, 0), 100, 100);  // 绘制椭圆
        // p.drawLine(0, 0, 50, 50);  // 注释掉的代码,不会被执行

        p.rotate(i++*10);  // 旋转坐标系
        p.drawLine(0, 0, 50, 50);  // 绘制旋转后的线条
    }

    void timerEvent(QTimerEvent *event)  // 重载 timerEvent 方法,处理定时器事件
    {
        update();  // 更新界面
    }

private:
    int i;  // 用于记录旋转角度的变量
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    i = 0;
    startTimer(1000);
}

Widget::~Widget()
{

}

效果

示例2

用于实现一个简单的画板功能。用户可以在窗口上按下鼠标左键开始绘制线条,拖动鼠标绘制线条,松开鼠标左键结束绘制。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMouseEvent>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT  // 使用 Q_OBJECT 宏,以便能够使用 Qt 的信号和槽机制

public:
    Widget(QWidget *parent = 0);  // 构造函数
    ~Widget();  // 析构函数

    void mousePressEvent(QMouseEvent *event)  // 处理鼠标按下事件
    {
        startp = event->pos();  // 记录鼠标按下时的位置
    }

    void mouseReleaseEvent(QMouseEvent *event)  // 处理鼠标释放事件
    {
        saveit = true;  // 标记需要保存当前绘制的线条
        update();  // 更新界面
    }

    void mouseMoveEvent(QMouseEvent *event)  // 处理鼠标移动事件
    {
        endp = event->pos();  // 记录鼠标移动时的位置
        update();  // 更新界面
    }

    void paintEvent(QPaintEvent *event)  // 重载 paintEvent 方法,用于绘制图形
    {
        if(saveit)
        {
            QPainter px(pix);  // 创建一个新的 QPainter 对象
            px.drawLine(startp, endp);  // 在 QPixmap 对象上绘制线条,否则下一个线条会消失
            saveit = false;  // 将保存标志复位
        }

        QPainter p(this);  // 创建一个 QPainter 对象,绘制到当前窗口部件上
        p.drawPixmap(0, 0, *pix);  // 将 QPixmap 对象绘制到窗口上
        p.drawLine(startp, endp);  // 实时显示当前绘制的线条
    }

private:
    QPoint startp;  // 起始点坐标
    QPoint endp;  // 终点坐标
    QPixmap *pix;  // 用于保存绘制内容的 QPixmap 对象
    bool saveit;  // 标志是否需要保存当前绘制的线条
};

#endif // WIDGET_H

widget.cpp 

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //创建了一个与窗口大小相同的 QPixmap 对象,并将其填充为白色背景。同时,将保存标志 saveit 初始化为 false
    pix = new QPixmap(this->width(), this->height());
    pix->fill();

    saveit = false;
}

Widget::~Widget()
{

}

 

3 事件过滤

class A:public Qobject{
};

class B:public Qobject{
Public:
	bool eventFilter(Qobject *sender, Qevent *event){
		return QObject::eventFilter(obj, event); 
	}
};
A x;
B y;
x.installeventfilter(&y);

事件示例

一个事件,如先进过快捷键,后经过按钮。最终效果键盘可以切换图片,按钮也可以切换

widget.h 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QFileDialog>
#include <QStringList>
#include <QEvent>
#include <QKeyEvent>

class Widget : public QWidget
{
    Q_OBJECT // 使用 Q_OBJECT 宏,以便能够使用 Qt 的信号和槽机制
public slots:
    void openfiles() // 打开图片文件槽函数
    {
        index = 0; // 初始化索引为0
        files = QFileDialog::getOpenFileNames(); // 获取选择的图片文件列表
        QPixmap pix(files[index]); // 加载第一张图片
        lb->setPixmap(pix); // 在 QLabel 上显示图片
    }

    void showr() // 显示下一张图片槽函数
    {
        if(index+1 < files.length()) // 判断是否还有下一张图片
            index++;
        else
            index = 0; // 循环显示图片

        QPixmap pix(files[index]); // 加载指定索引的图片
        lb->setPixmap(pix); // 在 QLabel 上显示图片
    }

    void showl() // 显示上一张图片槽函数
    {
        if(index-1 >= 0) // 判断是否还有上一张图片
            index--;
        else
            index = files.length()-1; // 循环显示图片

        QPixmap pix(files[index]); // 加载指定索引的图片
        lb->setPixmap(pix); // 在 QLabel 上显示图片
    }

    bool eventFilter(QObject *watched, QEvent *event) // 事件过滤器函数
    {
        lb->setFocus(); // 设置 QLabel 获得焦点
        if(watched == lb) // 如果事件源是 QLabel
        {
            if(event->type() == QEvent::KeyPress) // 如果是键盘按键事件
            {
                QKeyEvent *keyevent = static_cast<QKeyEvent*>(event); // 将事件转换为键盘事件
                if(keyevent->key() == Qt::Key_Left) // 如果按下左箭头键
                    showl(); // 显示上一张图片
                else if(keyevent->key() == Qt::Key_Right) // 如果按下右箭头键
                    showr(); // 显示下一张图片
                return true; // 返回 true 表示事件已处理
            }
        }

        return QWidget::eventFilter(watched, event); // 其他情况交给父类处理
    }
public:
    Widget(QWidget *parent = 0); // 构造函数
    ~Widget(); // 析构函数
private:
    QLabel *lb; // 显示图片的 QLabel 对象
    QPushButton *lbt, *rbt, *openbt; // 左右切换和打开文件的按钮

    QStringList files; // 存储打开的图片文件列表
    int index; // 当前显示图片的索引
};

#endif // WIDGET_H

widget.cpp

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // 创建 QLabel 控件,并设置大小、缩放内容以及获取焦点
    lb = new QLabel;
    lb->setMinimumSize(640, 480);
    lb->setScaledContents(true);
    lb->setFocus();
    lb->installEventFilter(this); // 安装事件过滤器,用于处理键盘事件

    // 创建左右切换和打开文件的按钮,并添加到水平布局中
    lbt = new QPushButton("<");
    rbt = new QPushButton(">");
    openbt = new QPushButton("open");
    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addStretch();
    hbox->addWidget(lbt);
    hbox->addWidget(openbt);
    hbox->addWidget(rbt);
    hbox->addStretch();

    // 创建垂直布局,将 QLabel 和水平布局添加到其中,并设置为 Widget 的布局
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(lb);
    vbox->addLayout(hbox);
    setLayout(vbox);

    index = 0; // 初始化索引为0

    // 连接按钮的点击信号与槽函数
    connect(openbt, SIGNAL(clicked(bool)), this, SLOT(openfiles())); // 打开文件按钮
    connect(lbt, SIGNAL(clicked(bool)), this, SLOT(showl())); // 左箭头按钮
    connect(rbt, SIGNAL(clicked(bool)), this, SLOT(showr())); // 右箭头按钮
}

Widget::~Widget()
{
    // 析构函数为空,因为 Qt 会自动管理对象的内存释放
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大厂AI课学习笔记NO.59】(12)过拟合与欠拟合

拟合就是调整参数和模型&#xff0c;让结果无限接近真实值的过程。 我们先来了解个概念&#xff1a; 偏差-方差窘境&#xff08;bias-variance dilemma&#xff09;是机器学习中的一个重要概念&#xff0c;它涉及到模型选择时面临的权衡问题。 偏差&#xff08;Bias&#xf…

自建Redis蜜罐以捕获和分析潜在攻击

一、引言 随着网络攻击的日益频繁和复杂&#xff0c;传统的防御措施往往难以应对。蜜罐作为一种主动防御技术&#xff0c;通过模拟有价值的服务来吸引攻击者&#xff0c;从而收集和分析攻击数据&#xff0c;提高网络安全性。本文将介绍如何自建一个Redis蜜罐&#xff0c;以捕获…

转转测试环境docker化实践

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程&#xff0c;一周学完让你面试通过率提高90%&#xff01;&#xff08;自动化测试&#xff09; 测试环境对于任何一个软件公司来讲&#xff0c;都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几…

【开源】JAVA+Vue.js实现农家乐订餐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核心代码4.1 查询菜品类型4.2 查询菜品4.3 加购菜品4.4 新增菜品收藏4.5 新增菜品留言 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的农家乐订餐系统&#xff0c…

MS1030超声波流量高精度测量电路

产品简述 MS1030 是一款针对超声波流量高精度测量电路&#xff0c;它具有高 精度&#xff0c;高稳定性&#xff0c;高效率的特点。它的测量精度 15ps &#xff0c;测量范 围 500ns  4ms4MHz 。在第一波模式情况下&#xff0c;内部比较器的 offset 可编程范围为 127…

type.GetFields() 获取不到,改用type.DeclaredFields

StatisticQuery 类 private Dictionary<string, DateTime> GetTBHBDate(StatisticQuery model, string field){Dictionary<string, DateTime> dic new Dictionary<string, DateTime>();DateTime TB new DateTime();//同比开始日期 &#xff08;年&#xff…

计网面试题整理下

1. HTTP常见的状态码有哪些&#xff1f; 常见状态码&#xff1a; 200&#xff1a;服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。301 &#xff1a; (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时&am…

揭秘测试工程师的6大必备技能!你也常遇到这个问题吗?

作为一名Tester&#xff0c;无论是面试还是工作&#xff0c;我们都常常会遇到该问题&#xff0c;毕竟现在大部分接手的项目都是中小型的项目&#xff0c;很多又是生疏行业的系统&#xff0c;所以这个问题就会常常伴随我们&#xff0c;那么遇到这个问题该怎么办呢&#xff0c;现…

淘宝1688京东商品采集API接口系列,item_get-获得淘宝商品详情

请求示例&#xff0c;API接口接入Anzexi58 商品采集API接口系列 商品搜索API&#xff1a; 功能&#xff1a;根据关键词、分类、价格范围等条件搜索商品。参数&#xff1a;关键词、分类ID、价格范围、品牌等。返回&#xff1a;商品列表&#xff0c;包括商品ID、名称、价格、图片…

【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 一、仿函数1.1 仿函数的介绍1.2 仿函数的优势 二、priority_queue2.1 push2.2 pop2.3 top2.4 size2.5 empty 三、…

[Java 探索之路~大数据篇] 新时代大数据流处理入门指南

本文主要介绍大数据基础&#xff0c;以及 flink 流计算 文章目录 【基础知识】1. 批处理与流处理1.批处理2.流处理 2. 为什么需要一个优秀的流处理框架1. 股票交易的业务场景2.生产者——消费者模型3. 流处理框架要解决的诸多问题&#xff08;1&#xff09;可扩展性&#xff08…

自定义View中的ListView和ScrollView嵌套的问题

当我们在使用到ScrollView和ListView的时候可能会出现显示不全的问题。那我们可以进行以下分析 ScrollView在测量子布局的时候会用UNSPECIFIED。通过源码观察&#xff0c; 在ScrollView的onMeasure方法中 Overrideprotected void onMeasure(int widthMeasureSpec, int heightMe…

C++ 类的大小 原理+详细计算示例

大小的组成 类的大小受&#xff1a;基类&#xff0c;成员&#xff0c;虚基表指针&#xff0c;虚函数表指针 影响。 计算方式 需要按照下列要素对齐和规则计算对齐&#xff1a; 对齐要素 编译器默认对齐数 根据环境改变&#xff0c;一般32位为4&#xff0c;64位为8。 有效…

KMP算法模板

KMP算法模板 自用&#xff0c;相关题解参考

电瓶车充电安全谈|南京小区15死44伤火灾背后的思考

今年2月23日&#xff0c;南京雨花台区明尚西苑居民楼发生了一起重大火灾事故&#xff0c;在事故中&#xff0c;共有59人受到不同程度的伤害&#xff0c;遇难的有15人&#xff0c;另有44人在医院接受治疗。 南京雨花台区火灾的发生无疑是一场令人痛心的悲剧&#xff0c;这场事故…

如何在 Linux 中快速清空文件而不删除它们?

在Linux系统中&#xff0c;清空文件而不删除它们是一种常见的需求&#xff0c;特别是在需要保留文件结构或权限的情况下。本文将详细介绍如何在Linux环境中快速清空文件内容的多种方法&#xff0c;以及每种方法的优缺点。清空文件通常涉及到文件内容的擦除&#xff0c;但并不涉…

【MySQL】事务管理 -- 详解

一、前言 CURD 不加控制&#xff0c;会有什么问题&#xff1f; CURD 满足什么属性&#xff0c;能解决上述问题&#xff1f; 买票的过程得是原子的。买票应该不能受互相的影响。买完票应该要永久有效。买前和买后都要是确定的状态。 什么是事务&#xff1f; 事务就是一组 DML…

DCTNet

DCTNet http://giantpandacv.com/academic/%E7%AE%97%E6%B3%95%E7%A7%91%E6%99%AE/%E9%A2%91%E5%9F%9F%E4%B8%AD%E7%9A%84CNN/CVPR%202020%20%E5%9C%A8%E9%A2%91%E5%9F%9F%E4%B8%AD%E5%AD%A6%E4%B9%A0%E7%9A%84DCTNet/ 一个对输入图像进行频域转换和选择的方法&#xff0c;达到…

Timeout while connecting to “172.168.252.245:161

Timeout while connecting to “172.168.252.245:161” 现象 排查过程 交换机型号H3C&#xff0c;交换机采用SNMPV3协议对接zabbix&#xff0c;交换机配置如下 snmp-agent sys-info version all snmp-agent group v3 zabbix_group privacy read-view isoview snmp-agent …

本地安装部署Flask并结合内网穿透实现远程访问本地web界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…