Qt事件处理,提升组件类

1.相关说明

1.提升组件QLabel的类,以实现双击功能

2.监控键盘事件,实现上下左右移动

3.鼠标点击获取坐标

 2.相关界面

3.相关代码和操作

自定义类TMyLabel,父类为QLabel

tmylabel.h

#ifndef TMYLABEL_H
#define TMYLABEL_H
#include <QLabel>
#include <QObject>
class TMyLabel : public QLabel
{Q_OBJECT
public:TMyLabel(QWidget *parent=nullptr);
signals:    // 信号void doubleClicked();// QWidget interface
protected:void mouseDoubleClickEvent(QMouseEvent *event) override;// QObject interface
public:bool event(QEvent *event) override;
};
#endif // TMYLABEL_H

tmylabel.cpp

#include "tmylabel.h"
#include <QEvent>
TMyLabel::TMyLabel(QWidget *parent):QLabel(parent)
{setAttribute(Qt::WA_Hover, true);
}
// 双击label发射信号
void TMyLabel::mouseDoubleClickEvent(QMouseEvent *event)
{Q_UNUSED(event);// 当双击Label时,发送信号,主界面就能捕获到emit doubleClicked();
}
bool TMyLabel::event(QEvent *event)
{if(event->type() == QEvent::HoverEnter){QPalette plet = this->palette();plet.setColor(QPalette::WindowText, Qt::red);setPalette(plet);}else if(event->type() == QEvent::HoverLeave){QPalette plet = this->palette();plet.setColor(QPalette::WindowText, Qt::black);setPalette(plet);}return QLabel::event(event);
}

 提升labDoubeClick对象的类

填写自定义的TMyLabel类

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
private:Ui::Widget *ui;// QWidget interface
protected:void mousePressEvent(QMouseEvent *event) override;void keyPressEvent(QKeyEvent *event) override;void paintEvent(QPaintEvent *event) override;// QWidget interface
protected:void closeEvent(QCloseEvent *event) override;
private:void do_doubleClick();
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMouseEvent>
#include <QMessageBox>
#include "tmylabel.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);grabKeyboard(); // 抓取键盘输入connect(ui->labDoubleClick, &TMyLabel::doubleClicked, this, &Widget::do_doubleClick);
}
Widget::~Widget()
{delete ui;
}
// 鼠标左击
void Widget::mousePressEvent(QMouseEvent *event)
{if(event->button() != Qt::LeftButton){ // 鼠标左键按下生效return;}QPoint pt = event->pos();   // 相对widget的位置QPointF relaPt = event->position();QPointF winPt = event->scenePosition();QPointF globPt = event->globalPos(); // 相对屏幕位置QString str = QString::asprintf("pos()=(%d,%d)", pt.x(), pt.y());str += QString::asprintf("\npostion()=(%.0f,%.0f)", relaPt.x(), relaPt.y());str += QString::asprintf("\nscenePosition()=(%.0f,%.0f)", winPt.x(), winPt.y());str += QString::asprintf("\nglobalPos()=(%.0f,%.0f)", globPt.x(), globPt.y());ui->labMove->setText(str);ui->labMove->adjustSize();ui->labMove->move(event->pos());QWidget::mousePressEvent(event);
}
// 键盘 上下左右
void Widget::keyPressEvent(QKeyEvent *event)
{QPoint pt = ui->btnMove->pos();if((event->key() == Qt::Key_A) || (event->key() == Qt::Key_Left)){ui->btnMove->move(pt.x()-20, pt.y());}else if((event->key() == Qt::Key_D) || (event->key() == Qt::Key_Right)){ui->btnMove->move(pt.x()+20, pt.y());}else if((event->key() == Qt::Key_W) || (event->key() == Qt::Key_Up)){ui->btnMove->move(pt.x(), pt.y()-20);}else if((event->key() == Qt::Key_S) || (event->key() == Qt::Key_Down)){ui->btnMove->move(pt.x(), pt.y()+20);}QWidget::keyPressEvent(event);
}
void Widget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);painter.drawPixmap(0, 0, width(), height(), QPixmap(":/jpg/jpg/shenli.jpg"));
}
// 关闭窗口
void Widget::closeEvent(QCloseEvent *event)
{QMessageBox::StandardButton result = QMessageBox::question(this, "消息框", "确定退出吗?",QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);if(result == QMessageBox::Yes){event->accept();} else {event->ignore();}
}
void Widget::do_doubleClick()
{ui->labDoubleClick->setText("标签被双击了");ui->labDoubleClick->adjustSize();
}

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

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

相关文章

ARM_Linux的交叉开发以及交叉编译器

目录 为什么要使用交叉开发 为什么要使用交叉编译 交叉编译器的安装 交叉编译器的使用 为什么要使用交叉开发 交叉开发是指在通用的电脑上吧程序编写&#xff0c;编译&#xff0c;调试好&#xff0c;再下载到嵌入式产品中去运行&#xff0c;对于一些简单的程序的话&#xff…

SpringBoot3整合OpenAPI3(Swagger3)

文章目录 一、引入依赖二、使用1. OpenAPIDefinition Info2. Tag3. Operation4. Parameter5. Schema6. ApiResponse swagger2更新到3后&#xff0c;再使用方法上发生了很大的变化&#xff0c;名称也变为OpenAPI3。 官方文档 一、引入依赖 <dependency><groupId>…

如何快速制作动态gif图?制作gif动图就这么简单

静图和动图是图像的两种不同形式。静图是一张静止不动的图片&#xff0c;没有任何动作或变化。而动图则是由一系列静止的图像组成&#xff0c;通过快速连续播放这些图像&#xff0c;可以形成看起来像是有动作的效果。简单来说&#xff0c;静图是静止的&#xff0c;而动图是具有…

网络安全(初版,以后会不断更新)

1.网络安全常识及术语 资产 任何对组织业务具有价值的信息资产&#xff0c;包括计算机硬件、通信设施、IT 环境、数据库、软件、文档 资料、信息服务和人员等。 漏洞 上边提到的“永恒之蓝”就是windows系统的漏洞 漏洞又被称为脆弱性或弱点&#xff08;Weakness&#xff09;&a…

2024年腾讯云优惠券(代金券)领取入口整理汇总

腾讯云作为国内知名的云服务提供商&#xff0c;提供了丰富的云产品&#xff0c;包括云服务器、数据库、存储、CDN等。为了帮助用户降低成本&#xff0c;腾讯云会经常推出各种优惠券活动。本文为大家整理汇总了腾讯云优惠券的领取入口&#xff0c;希望可以助力大家轻松上云&…

RedisConnectionException: Unable to connect to redis.xxx.com:6379

报错 org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to redis.xxx.com:6379at org.springframework.data.redis.connection.lettuc…

nginx虚拟主机

虚拟主机指的就是一个独立的站点配置&#xff0c;是nginx默认支持的一个功能&#xff0c;它能够有自己独立的域名&#xff0c;独立的ip&#xff0c;独立的端口配置&#xff0c;能够配置完整的www服务&#xff0c;列如网站搭建&#xff0c;邮件服务器代理等等。并且nginx支持多虚…

如何在Linux运行RStudio Server并实现Web浏览器远程访问

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. …

2024最新软件测试面试题合集

1、前端和后端有什么区别 前端能够从 App 屏幕和浏览器上看到的东西。例如&#xff0c;你所看到的内容、按钮、图片&#xff0c;它们都属于前端。 后端就是那些你在屏幕上看不到但又被用来为前端提供支持的东西。网站的后端涉及搭建服务器、保存和获取数据&#xff0c;以及用于…

烟台工业元宇宙赋能新型工业化,推动工业制造业数字化转型发展

烟台工业元宇宙随着科技的不断发展&#xff0c;新型工业化已经成为全球工业制造业的重要趋势。在这个大背景下&#xff0c;烟台工业元宇宙的提出&#xff0c;为工业制造业的数字化转型提供了新的思路和方向。巨蟹数科将围绕烟台工业元宇宙的概念、优势、实践以及未来发展方向进…

C++设计模式(李建忠)笔记4(完结)

C设计模式&#xff08;李建忠&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考链接 Youtube: C设计模式 Gtihub源码与PPT&#xff1a;https://github.com/ZachL1/Bilibili-plus 豆瓣: 设计模式–可复用面向对象软件的基础 总结23种设计模式…

真题解析 | 2022数模美赛C题:股票投资策略

1、准备工作 1.1 题目背景 市场交易者频繁买卖波动性资产&#xff0c;目标是最大化其总回报。每次买卖通常都会有佣金。 两种这样的资产是黄金和比特币。 图 1&#xff1a;黄金每日价格&#xff0c;每金衡盎司美元。 资料来源&#xff1a;伦敦金银市场协会&#xff0c;2021 年…