lv20 QT事件

news2024/11/19 3:25:48

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 会自动管理对象的内存释放
}

 

 

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

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

相关文章

【Android12】Monkey压力测试源码执行流程分析

Monkey压力测试源码执行流程分析 Monkey是Android提供的用于应用程序自动化测试、压力测试的测试工具。 其源码路径(Android12)位于 /development/cmds/monkey/部署形式为Java Binary # development/cmds/monkey/Android.bp // Copyright 2008 The Android Open Source Proj…

《PyTorch深度学习实践》第九讲多分类问题

一、 1、softmax的输入不需要再做非线性变换&#xff0c;也就是说softmax之前不再需要激活函数。softmax两个作用&#xff0c;如果在进行softmax前的input有负数&#xff0c;通过指数变换&#xff0c;得到正数。所有类的概率求和为1。 2、y的标签编码方式是one-hot。one-hot是…

java爬取深圳新房备案价

Java爬取深圳新房备案价 这是我做好效果,一共分3个页面 1、列表;2、统计;3、房源表 列表 价格分析页面 房源页面 一、如何爬取 第一步:获取深圳新房备案价 链接是:http://zjj.sz.gov.cn/ris/bol/szfdc/index.aspx 第二步:通过楼盘名查询获取明细 链接:http://z…

就业班 2401--2.27 Linux Day6--管道和重定向

管道与重定向 只有在开水里&#xff0c;茶叶才能展开生命浓郁的香气. 一、重定向 标准输入、标准正确输出、标准错误输出 进程在运行的过程中根据需要会打开多个文件&#xff0c;每打开一个文件会有一个数字标识。这个标识叫文件描述符。 进程使用文件描述符来管理打开的文件…

Android PDFView 提示401 pom

背景 在开发安卓app&#xff0c;使用PDF组件来解析URL地址 &#xff0c;从github找到一个开源组件 AndroidPdfViewer 遇到一个大坑&#xff0c;一直提示下载依赖401 pom 打开控制台链接弹出需要登录jitpack 原因分析&#xff1a; 这个组件项目依赖库链接到了需要鉴权的…

【airtest】自动化入门教程(一)AirtestIDE

目录 一、下载与安装 1、下载 2、安装 3、打开软件 二、web自动化配置 1、配置chrome浏览器 2、窗口勾选selenium window 三、新建项目&#xff08;web&#xff09; 1、新建一个Airtest项目 2、初始化代码 3、打开一个网页 四、恢复默认布局 五、新建项目&#xf…

服务器数据恢复-服务器RAID5上层XFS文件系统分区数据恢复案例

服务器数据恢复环境&#xff1a; MD1200磁盘柜中的磁盘通过RAID卡创建了一组RAID5阵列&#xff0c;分配了一个LUN。在Linux操作系统层面对该LUN进行了分区&#xff0c;划分sdc1和sdc2两个分区&#xff0c;通过LVM扩容的方式将sdc1分区加入到了root_lv中&#xff1b;sdc2分区格式…

VuePress + GitHub 搭建个人博客踩坑记录

最近想给我教练搭个网站,本来选的是 VuePress 框架,也折腾完了,起码是搭建出来了,踩的坑也都总结好了 但是最近发现了一个更简洁的模板: VuePress-theme-hope ,所以最终网站使用的样式是这个 不过我觉得这里面踩坑的记录应该还是有些价值的,分享出来,看看能不能帮到一些小伙伴~…

手机AI摄影时代开启,传音引领行业标准化建设

今年春节&#xff0c;AI摄影可谓大出风头。人们在社交平台晒出自己在龙年的AI写真&#xff0c;极大地增添了节日的氛围感&#xff0c;也让我们看到了“AI摄影”的价值。新年伊始&#xff0c;手机巨头们纷纷布局该赛道&#xff0c;基于AI大模型实现的影像功能成为业界关注焦点。…

CAPL编程学习笔记--关于on 事件的详细解释

CAPL编程是比较有特色的一种面向通讯的编程语言。 1&#xff1a;on XXX类型&#xff08;即事件类型&#xff09; 维克多的官方文档对CAPL的描述是一门类C语言&#xff0c;说白了它也是用C写出来的。我们看on&#xff08;注意都是小写&#xff09;事件的代码结构 on * { }&…

算法day03_ 59.螺旋矩阵II

推荐阅读 算法day01_ 27. 移除元素、977.有序数组的平方 算法day02_209.长度最小的子数组 目录 推荐阅读59.螺旋矩阵 II题目思路解法 59.螺旋矩阵 II 题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形…

2023年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…

2023年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中&#xff0c;敬请期待… 武汉唯众智创科技有限公司 2024 年 2 月 联系人&#xff1a;辜渝傧13037102709 题号&#xff1a;试题01 模块三&#xff1a;业务分析与可视化 &#xff08;一&#xff0…

【Web安全靶场】sqli-labs-master 38-53 Stacked-Injections

sqli-labs-master 38-53 Stacked-Injections 其他关卡和靶场看专栏… 文章目录 sqli-labs-master 38-53 Stacked-Injections第三十八关-报错注入第三十九关-报错注入第四十关-盲注第四十一关-盲注第四十二关-联合报错双查询注入第四十三关-报错注入第四十四关-盲注第四十五关-…

Facebook的元宇宙实践:数字化社交的新前景

近年来&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念备受瞩目&#xff0c;被认为是数字化社交的未来趋势之一。而在众多科技巨头中&#xff0c;Facebook&#xff08;现更名为Meta&#xff09;一直处于元宇宙发展的前沿。在本文中&#xff0c;我们将深入探讨Fac…

linux系统Jenkins工具web配置

Jenkins工具配置 插件配置系统配置系统工具配置 插件配置 下载 Maven Integration Pipeline Maven lntegration gitlab Generic webhook Trigger nodejs Blue ocean系统配置 系统配置结束系统工具配置

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果质量识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本篇博客详尽介绍了一套基于深度学习的水果质量识别系统及其实现代码。系统采用了尖端的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等前代算法进行了详细的性能对比分析&#xff0c;提供在识别图像、视频、实时视频流和批量文件中水果方面的高效准确性…

32单片机基础:TIM输出比较

这个输出比较功能是非常重要的&#xff0c;它主要是用来输出PWM波形,PWM波形又是驱动电机的必要条件&#xff0c;所以你如果想用STM32做一些有电机的项目&#xff0c;比如智能车&#xff0c;机器人等。 IC: Input Capture 输入捕获 CC:Capture/Compare一般表示输入捕获和输出…

【Leetcode每日一刷】哈希表|纲领、242.有效的字母异位词、349. 两个数组的交集

纲领 &#x1f517;代码随想录理论部分 关于哈希表这个数据结构就不再重复讲了&#xff0c;下面对几个关键点记录一下&#xff1a; 哈希碰撞 解决方法1&#xff1a;拉链法 解决方法2&#xff1a;线性探测法 下面针对做题要用到的三种结构讲一下&#xff08;也是重复造轮子了…

解释一下前端框架中的虚拟DOM(virtual DOM)和实际DOM(real DOM)之间的关系。

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

windows server mysql 数据库停止 备份 恢复全流程操作方法

一,mysql备份 mysql最好是原工程文件备份.不需要sql查询的方式备份.安全高效. 比如,安装php与mysql组合后,我的mysql文件保存在: D:\phpstudy_pro\Extensions\MySQL5.7.26\data\dux 我只需要复制一份,保存起来就行. 二,mysql恢复 怎么恢复呢.我们一般是只恢复其中一个表,则找…