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.hqwc.cn/news/509932.html

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

相关文章

【MySQL系列】在 MacOS 上安装 MySQL

在 MacOS 上有两种方式安装 MySQL 服务器&#xff1a;通过 brew 安装和通过安装包安装。 文章目录 1、通过 brew 安装 MySQL1.1、安装 MySQL1.2、启动 MySQL 服务器1.3、配置 MySQL 服务器1.4、MySQL 服务器管理命令 2、通过安装包安装 MySQL2.1、下载安装包2.2、安装 MySQL2.3…

程序人生:当看到男友学测试拿高薪后,我突然悟了......

Hello&#xff0c;大家好&#xff0c;我是小雨 认识软件测试是因为我男朋友&#xff0c;他在华测教育培训软测后出去就业非常不错&#xff0c;所以我也萌生了转行的想法&#xff0c;当时我的想法是&#xff0c;他都能学会&#xff0c;那我肯定没问题&#xff0c;所以在他的介绍…

Mongodb安装配置

Mongodb安装配置 一、MongoDB简介二、Windows下MongoDB安装2.1.MongoDB下载2.2.安装MongoDB【解压版】2.2.1.解压2.2.2.创建和 bin 目录同级 data\db 目录来存储 MongoDB 产生的数据2.2.3.进入 bin 目录&#xff0c;cmd命令行窗口&#xff0c;使用命令的指定存储数据文件的形式…

[NSSCTF 2nd]MyJs

做一题ejs原型链污染 首先是登录界面 源码里面提示了源码的路由 js不熟先审计一下 const express require(express); #导入Express框架&#xff0c;用于构建Web应用程序的服务器和路由 const bodyParser require(body-parser); #导入body-parser中间件&#xff0c;用于解析…

网盘拉新如何对接?盘点最靠谱的一手渠道平台

2024网盘行业再次重燃战火。字节旗下产品头条搜索极速版APP、悟空浏览器APP推出对应的网盘功能&#xff0c;刚刚开放了拉新推广&#xff0c;现在是一个不能错过新项目的好时机。 如果你对网盘拉新推广充满热情&#xff0c;千万不要错过星子助推联合字节推出的网盘项目机会。小…

视频如何无水印保存?这三种下载方法赶紧收藏

在互联网时代&#xff0c;视频已成为我们获取信息、娱乐休闲的重要途径。然而&#xff0c;有时我们想要保存或分享某些视频时&#xff0c;却发现下载起来却带有水印。为了解决这个问题&#xff0c;今天给大家带来几个无水印下载的方法。 方法一&#xff1a;水印云 水印云是一…

基于OpenCompass的大模型评测实践

大模型评测教程 随着人工智能技术的快速发展&#xff0c; 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI于2018年提出了第一代GPT模型&#xff0c;开辟了自然语言模型生成式预训练的路线。沿着这条路线&#xff0c;随后又陆续发布了GPT-2和GPT-3模型。与此同时&a…

2093409-57-3,DBCO PEG3 NH2,可以在无铜条件下与多种含有叠氮基的分子进行反应

2093409-57-3&#xff0c;二苯并环辛炔-三聚乙二醇-胺&#xff0c;DBCO-PEG3-amine&#xff0c;DBCO PEG3 NH2&#xff0c;可以在无铜条件下与多种含有叠氮基的分子进行反应&#xff0c;能够与其他分子进行偶联 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;2093…

2024年腾讯云服务器优惠券领取入口及使用教程

随着云计算技术的不断发展&#xff0c;越来越多的企业和个人选择将业务迁移到云端。腾讯云作为国内领先的云计算服务提供商&#xff0c;为了吸引用户上云&#xff0c;经常推出多种优惠活动&#xff0c;其中就包括服务器优惠券&#xff0c;本文将为大家分享腾讯云服务器优惠券的…

Linux 学习笔记(10)

十、 进程管理 进程就是运行中的程序&#xff0c;一个运行着的程序&#xff0c;可能有多个进程。 比如 LinuxSir.Org 所用的 WWW 服务器是 apache 服务器&#xff0c;当管理员启动服务后&#xff0c;可能会有好多人来访问&#xff0c;也就是说许多用户来同时请 求 htt…

MySQL的初学者教程—python连接mysql的方法

MySQL的初学者教程—python连接mysql的方法 准备工作&#xff1a; IDLE软件&#xff08;下载、安装的方法参见本博客中其他的教程&#xff09; MySQL&#xff08;下载、安装、建数据库、建表等方法参见本博客中其他的教程&#xff09; 1、运行IDLE&#xff0c;将下面的测试代码…

一文读懂Persistence One- 如何将Restaking带入Cosmos

Persistence One正在将Restaking引入Cosmos。用户将能够通过pSTAKE、Stride、Quicksilver和Milkyway将Liquid Staked Tokens&#xff08;如ATOM、TIA、DYDX等&#xff09;存入Persistence One&#xff0c;对其进行Restaking&#xff0c;从而安全地连接更多区块链&#xff0c;首…