lv20 QT事件5

news2024/11/15 16:43:18

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/1488046.html

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

相关文章

打造专属投屏体验:Windows系统投屏到iOS系统

想要将电脑投屏共享给同事或朋友&#xff0c;又担心隐私内容泄露&#xff1f;来来来&#xff0c;这里有妙招&#xff01; AirDroid Cast网页版让电脑投屏变得挑剔&#xff0c;只展示你允许共享的内容。会议资料、个人照片、敏感文件&#xff0c;都将得到严格的筛选&#xff0c;…

js中find和findLast的区别

一、概念 find()&#xff1a;从数组中查找第一个匹配的元素 findLast()&#xff1a;从数组中查找最后一个匹配的元素 二、用法 array.find((项)>{return 筛选项的条件 })array.findLast((项)>{return 筛选项的条件 }) 三、区别 find方法是从数组头部往后检测&#xff…

AwesomeTechnologyWeekly值的关注的中文社区优质技术周刊一览

作为开发者&#xff0c;我们每天都需要吸收大量的信息补充我们的知识体系. Awesome Technology Weekly Zh-Hans 项目收集了中文技术社区各个领域的高质量的中文技术月/周/日刊&#xff0c;定时刷新获取最新一期中文技术月/周/日刊进行展示. 访问网站开始关注吧~&#xff1a;ht…

自动驾驶感知面试-coding应用题

感知面试手撕代码&#xff1a;这个博主总结的很好&#xff0c;尤其是关于叉积的计算 双线性插值 双线性插值公式记忆方法和Python实现 NMS算法 #include<iostream> #include<vector> #include<algorithm>using namespace std; struct Box {int x1,x2,y1,…

【仿真基本功】【PyTorch】从头安装PyTorch(GPU版本)【2024/03/03更新】

【仿真基本功】【PyTorch】从头安装PyTorch&#xff08;GPU版本&#xff09;【2024/03/03更新】 安装步骤1. 安装Anaconda2. 查看显卡对CUDA版本的支持3. 查看PyTorch的安装需求4. 安装PyTorcha) 配置新环境b) 进入新环境c) 按照CUDA版本要求&#xff0c;必须小于等于显卡支持的…

Linux系统——Tomcat优化

目录 一、JVM组成 1.JVM的组成及详解 2.内存的由来 3.虚拟机 3.1 Garbage 垃圾确定方法 3.2垃圾回收基本算法 3.2.1标记-清除 Mark-Sweep 3.2.2标记压缩&#xff08;压实&#xff09;Mark-Compact 3.2.3复制 Copying 3.2.4 多种算法总结 3.2.5拓展——STW 4.分代堆…

C语言-------指针进阶(2)

1.指针数组 指针数组表较简单&#xff0c;类比整型数组&#xff0c;字符数组&#xff0c;整型数组里面的元素都是整型变量&#xff0c;字符数组里面 的元素是字符类型&#xff0c;那么指针数组就是数组里面的每个元素都是指针类型&#xff0c;例如int*arr[5]就是一个 指针数…

数字化转型导师坚鹏:金融机构数字化营销方法和案例研究

金融机构数字化营销方法和案例研究 课程背景&#xff1a; 很多金融控股集团存在以下问题&#xff1a; 不清楚金融机构数字化营销方法&#xff1f;&#xff08;以证券、保险、租赁行业为例&#xff09; 不清楚金融机构数字化营销案例&#xff1f;&#xff08;以证券、保险…

成功案例(IF=13.8)| 基因组de novo联合Hi-C组装萝卜高质量基因组

1 研究背景 萝卜&#xff08;Raphanus sativus L.&#xff09;是世界范围内重要的根茎蔬菜作物。肉质主根是最重要的可食器官&#xff0c;提供了许多有益的营养物质&#xff0c;包括碳水化合物、矿物质、核黄素、植物化学物质和膳食纤维。然而&#xff0c;尽管萝卜具有生物学…

24V转3.3V 36V转5V 60V转5V降压芯片 H6246

24V转5V降压芯片的工作原理&#xff1a; 通过控制开关管和脉冲宽度调制&#xff08;PWM&#xff09;技术实现的。当输入电压为24V时&#xff0c;芯片会将其通过开关管进行开关调节&#xff0c;控制电流的流动。同时&#xff0c;芯片还会利用PWM技术&#xff0c;调节开关管的开…

【喜报】蚂蚁科技成功获聘隐私计算联盟副理事长单位!

蚂蚁科技获聘信通院隐私计算联盟副理事长单位 近日&#xff0c;由中国信息通信研究院、中国通信学会、隐私计算联盟等单位联合承办的隐私计算大会上&#xff0c;蚂蚁科技集团股份有限公司获聘2023-2024年度"隐私计算联盟副理事长"单位。 隐私计算联盟是在工业和信息…

Spring初始(相关基础知识和概述)

Spring初始&#xff08;相关基础知识和概述&#xff09; 一、Spring相关基础知识&#xff08;引入Spring&#xff09;1.开闭原则OCP2.依赖倒置原则DIP3.控制反转IoC 二、Spring概述1.Spring 8大模块2.Spring特点2.Spring的常用jar文件 一、Spring相关基础知识&#xff08;引入S…

watchdog---基于python的文件夹监控框架

说明及介绍 watchdog是一个用于监控文件系统变化的Python库&#xff0c;可以监控文件或目录的创建、修改、删除等操作。watchdog可以通过监听文件系统事件来实时监控文件或目录的变化&#xff0c;当文件系统中的文件或目录发生变化时&#xff0c;watchdog会触发相应的事件&…

AFL mmap

fuzz_one函数中看到这么一句话 orig_in in_buf mmap(0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);对mmap不太理解&#xff0c;不明白这句话的意思。 首先&#xff0c;得去了解下mmap函数是干什么的&#xff0c; 找到一个简单易懂的博客&#xff1a;https://www.j…

RT-DETR算法优化改进: 特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合RT-DETR,实现涨点。 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现涨点 RT-DETR魔术师专栏介绍: https://blog.csdn.net/…

第15届蓝桥STEMA测评真题剖析-2024年1月28日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第173讲。 第15届蓝桥第4次STEMA测评&#xff0c;这是2024年1月28日举办的STEMA&#xff0c;比赛仍然采取线上形式。这…

c++数据结构算法复习基础-- 3 --线性表-单向链表-笔试面试常见问题

1、单链表逆序 思路图 代码实现 //著: 链表结构里记得加 friend void ReverseLink(Clink& link); void ReverseLink(Clink& link) {Node* p link.head_->next_;while( p nullptr){return;}Node* q p->next_;link.head_->next_ nullptr;while(p ! nullpt…

linux常用的解压缩工具介绍

在Linux系统中&#xff0c;解压缩文件是一种常见的操作。有多种工具可以用来解压缩文件&#xff0c;它们各自有不同的特点和优势。以下是一些常用的Linux解压缩工具&#xff0c;以及它们之间的区别。 1. tar tar是一个强大的文件打包和解包工具&#xff0c;它可以用来打…

基于springboot+vue的响应式企业员工绩效考评系统(源码+论文)

文章目录 前言 一、功能设计 1 普通员工功能 2 主管功能 3 系统管理员功能 4 评分标准功能 5 PC端与手机端 6 制图 二、功能实现 普通员工 1普通员工登录 2公告板块 3日志板块 主管 1主管登录 2公告板块 3日志板块 4绩效评分板块 5个人信息板块 系统管理员…

身份证识别系统(安卓)

设计内容与要求&#xff1a; 通过手机摄像头捕获身份证信息&#xff0c;将身份证上的姓名、性别、出生年月、身份证号码保存在数据库中。1&#xff09;所开发Apps软件至少需由3-5个以上功能性界面组成。要求&#xff1a;界面美观整洁、方便应用&#xff1b;可以使用Android原生…