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_OBJECTpublic: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 初始化为 falsepix = 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; // 初始化索引为0files = QFileDialog::getOpenFileNames(); // 获取选择的图片文件列表QPixmap pix(files[index]); // 加载第一张图片lb->setPixmap(pix); // 在 QLabel 上显示图片}void showr() // 显示下一张图片槽函数{if(index+1 < files.length()) // 判断是否还有下一张图片index++;elseindex = 0; // 循环显示图片QPixmap pix(files[index]); // 加载指定索引的图片lb->setPixmap(pix); // 在 QLabel 上显示图片}void showl() // 显示上一张图片槽函数{if(index-1 >= 0) // 判断是否还有上一张图片index--;elseindex = 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.rhkb.cn/news/268598.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NACOS在Windows和Linux下的安装教程

目录 1、Windows安装 1.1、下载安装包 1.2、解压 1.3、端口配置 1.4、启动 1.5、访问 2、Linux安装 2.1、安装JDK 2.2、上传安装包 2.3、解压 2.4、端口配置 2.5、启动 3、Nacos的依赖 1、Windows安装 开发阶段采用单机安装即可。 1.1、下载安装包 在Nacos的Git…

C++ sort排序

sort函数接受两个迭代器作为参数&#xff0c;分别表示要排序的范围的起始和结束位置。 请注意&#xff0c;sort函数默认使用小于运算符&#xff08;<&#xff09;来比较元素的顺序&#xff0c;默认从小到大排。 在这里&#xff0c;使用str.begin()和str.end()来表示整个字符…

水豚鼠标助手 强大的鼠标美化工具

水豚鼠标助手 水豚鼠标助手是一款 鼠标换肤、屏幕画笔、放大镜、聚光灯、屏幕放大、倒计时功能的强大屏幕演示工具。 软件助手获取 水豚鼠标助手1.0.0 安装教程 第一步&#xff1a;下载后&#xff0c;双击软件安装包 第二步&#xff1a;Windows可能会出现提示弹窗&#xff…

前端同时传递文件数据+非文件数据,前后端解决方案

之前录制视频《文件上传组件》的时候有位观众提了个问题&#xff0c;如果我没有理解错的话&#xff0c;应该就是前后同时传递文件数据 非文件数据&#xff0c;前后端数据该如何接收&#xff0c;这里我给出我自己的解决方案 tip:下文在编写前端代码的时候&#xff0c;用到了这篇…

【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 三、…

ChatGPT数据分析应用——同期群分析

ChatGPT数据分析应用——同期群分析 ​ 同期群分析在一定程度上属于分组分析的一个变种。顾名思义&#xff0c;同期群就是相同时期的群体&#xff0c;同期群分析就是针对相同时期的群体展开分析。接下来我们让ChatGPT解释这个方法的概念并提供相应的案例。发送如下内容给ChatG…

1.2 在卷积神经网络中,如何计算各层感受野的大小

1.2 在卷积神经网络中&#xff0c;如何计算各层感受野的大小 分析与解答&#xff1a; 在卷积神经网络中&#xff0c;由于卷积的局部连接性&#xff0c;输出特征图上的每个节点的取值&#xff0c;是由卷积核在输入特征图对应位置的局部区域内进行卷积而得到的&#xff0c;因此这…

程序环境和预处理(2)

文章目录 3.2.7 命名约定 3.3 #undef3.4 命令行定义3.5 条件编译3.6 文件包含3.6.1 头文件被包含的方式3.6.2 嵌套文件包含 4. 其他预处理指令 3.2.7 命名约定 一般来讲函数和宏的使用语法很相似&#xff0c;所以语言本身没法帮我们区分二者&#xff0c;那我们平时的一个习惯是…

Flutter开发进阶之Flutter Web加载速度优化

Flutter开发进阶之Flutter Web加载速度优化 通常使用Flutter开发的web加载速度会比较慢&#xff0c;原因是Flutter web需要加载的资源处于国外&#xff0c;以下是据此所做的相应优化。 一、FlutterWeb打包 flutter build web --web-renderer canvaskit使用新命令打包 flut…

微信小程序构建npm失败解决方式

安装完所需要的依赖后&#xff0c;在微信开发者工具菜单栏中选择&#xff1a;“工具” -> “构建 npm”&#xff0c;但是失败。 解决方法&#xff1a;修改 project.config.json 开发者工具创建的项目&#xff0c;miniprogramRoot 默认为 miniprogram&#xff0c;package.js…

大数据可视化python01

import pandas as pd import matplotlib.pyplot as plt# 设置中文改写字体 plt.rcParams[font.sans-serif] [SimHei]# 读取数据 data pd.read_csv(C:/Users/wzf/Desktop/读取数据进行数据可视化练习/实训作业练习/瓜果类单位面积产量.csv ,encoding utf-8)#输出 print(data)…

数字孪生与智慧交通的融合发展:推动交通行业数字化转型,构建智慧城市新生态

随着信息技术的快速发展和城市化进程的深入推进&#xff0c;交通行业正面临着前所未有的机遇与挑战。传统的交通管理模式已难以满足日益增长的交通需求&#xff0c;而数字化转型则成为了推动交通行业创新发展的必由之路。数字孪生技术作为一种前沿的信息技术手段&#xff0c;为…

【XR806开发板试用】SPI外设使用驱动OLED显示

XR806 SPI SPI功能引脚 阅读芯片功能引脚相关资料&#xff0c;使用硬件SPI。 https://xr806.docs.aw-ol.com/study/hard_pin/ 阅读SDK SPI使用例程在xr806\device\xradio\xr806\xr_skylark\project\example\spi 路径下 SPI自发自收测试 准备 短接开发板上的MOSI(PB04)和…

tcpdump 常用用法

简要记录下tcpdump用法 监控某个ip上的某个端口的流量 tcpdump -i enp0s25 tcp port 5432 -nn -S 各个参数作用 -i enp0s25 指定抓包的网卡是enp0s25 -nn 显示ip地址和数字端口 &#xff0c;如果只 -n 则显示ip&#xff0c;但是端口为services文件中的服务名 如果一个…

外汇市场新挑战:参与模拟交易,共赢高达15000美元奖金!

在外汇金融市场&#xff0c;以往的三年可以说是“时运多舛”的三年&#xff0c;从新冠疫情爆发&#xff0c;到互联网大厂裁员浪潮&#xff1b;从大规模通货膨胀席卷全球&#xff0c;到美联储连续基金加息&#xff1b;从俄乌战争持续白热化&#xff0c;到欧洲国家面临能源困局&a…

Linux之进程信号

目录 一、概念引入 1、生活中的信号 2、Linux中的信号 二、信号处理常见方式 三、信号的产生 1、键盘产生信号 2、系统调用接口产生信号 3、软件条件产生信号 4、硬件异常产生信号 四、信号的保存 相关概念 信号保存——三个数据结构 信号集——sigset_t 信号集操…

C++/数据结构:AVL树

目录 一、AVL树的概念 二、AVL树的实现 2.1节点定义 2.2节点插入 三、AVL树的旋转 3.1新节点插入较高左子树的左侧&#xff1a;右单旋 3.2新节点插入较高右子树的右侧&#xff1a;左单旋 3.3新节点插入较高左子树的右侧---左右&#xff1a;先左单旋再右单旋 3.4新节点插…

sheng的学习笔记-卷积神经网络经典架构-LeNet-5、AlexNet、VGGNet-16

目录&#xff1a;目录 看本文章之前&#xff0c;需要学习卷积神经网络基础&#xff0c;可参考 sheng的学习笔记-卷积神经网络-CSDN博客 目录 LeNet-5 架构图 层级解析 1、输入层&#xff08;Input layer&#xff09; 2、卷积层C1&#xff08;Convolutional layer C1&…

Vue3_2024_1天【Vue3创建和响应式,对比Vue2】

前言&#xff1a; Vue3对比Vue2版本&#xff0c;它在性能、功能、易用性和可维护性方面都有显著的提升和改进。 性能优化&#xff1a;模板编译器的优化、对Proxy的支持以及使用了更加高效的Virtual DOM算法等。这使得Vue3的打包大小减少了41%&#xff0c;初次渲染提速55%&#…

k8s 集群调度,标签,亲和性和反亲和性,污点和容忍,pod启动状态 排错详解

目录 pod启动创建过程 kubelet持续监听的原因 调度概念 调度约束 调度过程 优点 原理 优先级选项 示例 指定调度节点 标签基本操作 获取标签帮助 添加标签&#xff08;Add Labels&#xff09;&#xff1a; 更新标签&#xff08;Update Labels&#xff09; 删除标…