Qt:控件的封装、定时器、事件分发器、事件过滤器
一、案例1创建ui界面文件1.直接创建含ui界面文件的类:2.一个不含ui界面文件的类如何与一个新建的ui界面文件(举例form.ui)关联起来第一步:先添加一个界面文件第二步在类(举例MainWindow).h文件中做出如下修改#ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow namespace Ui { class abc; }//新加代码 class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); private: Ui::abc *ui;//新加代码 }; #endif // MAINWINDOW_H第三步 在类(举例MainWindow).cpp文件中做出如下修改#include mainwindow.h #include ui_form.h// 新加代码与ui文件名有关 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::abc) // 新加代码 { ui-setupUi(this);// 新加代码 } MainWindow::~MainWindow() { delete ui;// 新加代码 }注意事项abc均为对象的名称不要写成ui文件名了。二、案例2自定义封装控件目标微调框与水平滑块封装在一起任意模块改变数值另一个模块的数值也会发生相应的变化点击“获取当前值”按钮会将当前值以一个消息框的形式弹出。1.控件封装详细步骤2.ui界面文件3.测试代码在CostomWidget.cpp中写入如下代码CostomWidget::CostomWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::CostomWidget) { ui-setupUi(this); connect(ui-spinBox,QSpinBox::valueChanged,ui-horizontalSlider,QSlider::setValue);//数字设定框发生变化时进度条也发生变化 connect(ui-horizontalSlider,QSlider::valueChanged,ui-spinBox,QSpinBox::setValue); } void CostomWidget::setnum(int num) { ui-spinBox-setValue(num); } int CostomWidget::getnum() { return ui-spinBox-value(); } CostomWidget::~CostomWidget() { delete ui; }在CostomWidget.h的类中写入如下代码void setnum(int num); int getnum();在MainWidget.cpp的构造函数中写入如下代码connect(ui-btn1,QPushButton::clicked,this,[](){ QString str QString(当前值为%1).arg(ui-widget-getnum()); QMessageBox::information(this,info,str); }); connect(ui-btn2,QPushButton::clicked,this,[](){ ui-widget-setnum(50); });三、案例3定时器的使用方法目标标签中的数字从1开始递增每过500毫秒数字的值1点击“暂停”按钮停止递增。在MainWidget.cpp的构造函数中写入如下代码QTimer *tim1 new QTimer(this); tim1-start(500); connect(tim1,QTimer::timeout,ui-label,[](){ static int i 1; ui-label-setText(QString::number(i)); }); connect(ui-btn3,QPushButton::clicked,tim1,QTimer::stop);或者可以这样写QTimer::singleShot(500, this,[](){ static int i 1; ui-label-setText(QString::number(i)); }); connect(ui-btn3,QPushButton::clicked,tim1,QTimer::stop);四、案例4将一个 控件 与 类 关联起来目标将一个QLabel控件与MyLabel类绑定并且实现相应鼠标事件的检测。1.先写好MyLabel类①MyLabel.h代码class MyLabel : public QLabel { Q_OBJECT public: explicit MyLabel(QWidget *parent nullptr); void enterEvent(QEnterEvent *event)override;//鼠标进入事件 void leaveEvent(QEvent *event)override;//鼠标离开事件 void mouseMoveEvent(QMouseEvent *ev)override; void mousePressEvent(QMouseEvent *ev) override; void mouseReleaseEvent(QMouseEvent *ev) override; signals: };②MyLabel.cpp代码MyLabel::MyLabel(QWidget *parent) : QLabel{parent} { setMouseTracking(1);//在QWidget中//设置鼠标追踪状态//加上这行代码这后不管有没有鼠标按下mouseMoveEvent函数都会触发//否则只有当鼠标按下时才会触发mouseMoveEvent } void MyLabel::enterEvent(QEnterEvent *event) { qDebug() 鼠标进入了; } void MyLabel::leaveEvent(QEvent *event) { qDebug() 鼠标离开了; } void MyLabel::mouseMoveEvent(QMouseEvent *ev) { //if(ev-buttons() Qt::LeftButton)//鼠标按钮处于稳态触发要用buttons函数//即鼠标按下之后移动才会触发mouseMoveEvent事件 { QString str QString(鼠标移动了 x %1 y %2 glabolx %3 glaboly %4).arg(ev-pos().x()).arg(ev-pos().y()).arg(ev-globalPosition().x()).arg(ev-globalPosition().y());//.arg() 是 Qt 的 QString 类的字符串格式化方法。它用于将参数插入到字符串的占位符中。 qDebug() str; } } void MyLabel::mousePressEvent(QMouseEvent *ev) { if(ev-button() Qt::LeftButton)//若不加这一行代码这不管鼠标那一个按键按下都会执行函数中的代码 { QString str QString(鼠标按下了 x %1 y %2 glabolx %3 glaboly %4).arg(ev-pos().x()).arg(ev-pos().y()).arg(ev-globalPosition().x()).arg(ev-globalPosition().y());//.arg() 是 Qt 的 QString 类的字符串格式化方法。它用于将参数插入到字符串的占位符中。 qDebug() str; } } void MyLabel::mouseReleaseEvent(QMouseEvent *ev) { if(ev-button() Qt::LeftButton) { QString str QString(鼠标释放了 x %1 y %2 glabolx %3 glaboly %4).arg(ev-pos().x()).arg(ev-pos().y()).arg(ev-globalPosition().x()).arg(ev-globalPosition().y());//.arg() 是 Qt 的 QString 类的字符串格式化方法。它用于将参数插入到字符串的占位符中。 qDebug() str; } }2.在MainWidget.ui界面中添加一个新的Label控件---右键---找到如下窗口点击添加:再将该鼠标检测框---右键--提升为 MyLabel。3.事件分发器(event)与事件过滤器(eventfilter)①这两个事件返回值都是bool类型如果返回true表示用户要自己处理这个事情不向下分发事件。②以鼠标移动事件举例当鼠标移动时若目标(举例label)安装了事件过滤器则先通过事件过滤器检测若成功拦截则不再向下分发事件否则到达事件分发器若事件分发器成功拦截则不再向下分发事件否则到达mouseMoveEvent。代码测试①在mylabel.h类的声明中写入如下代码bool event(QEvent *e) override;//重写事件分发器②在mylabel.cpp中写入如下代码bool MyLabel::event(QEvent *e) { if(e-type() QEvent::MouseMove)//如果鼠标移动在event事件分发中做拦截操作 { QMouseEvent *ev dynamic_castQMouseEvent*(e);//此处涉及类型转换 QString str QString(event函数中鼠标移动了 x %1 y %2 glabolx %3 glaboly %4).arg(ev-pos().x()).arg(ev-pos().y()).arg(ev-globalPosition().x()).arg(ev-globalPosition().y());//.arg() 是 Qt 的 QString 类的字符串格式化方法。它用于将参数插入到字符串的占位符中。 qDebug() str; return true;//代表用户自己处理该事件不向下分发 } return QLabel::event(e);//其他事件交给父类 }③在mainwidget.h类的声明中写入如下代码bool eventFilter(QObject *object, QEvent *event) override;//重写事件过滤器④在mainwidget.cpp中写入如下代码#include mainwindow.h #include ui_mainwindow.h #include QMouseEvent MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui-setupUi(this); ui-label-installEventFilter(this); } //第二步重写事件过滤器 bool MainWindow::eventFilter(QObject *object, QEvent *event) { if(object ui-label) { if(event-type() QEvent::MouseMove) { QMouseEvent *ev dynamic_castQMouseEvent*(event); QString str QString(eventFilter函数中鼠标移动了 x %1 y %2 glabolx %3 glabolx %4).arg(ev-pos().x()).arg(ev-pos().y()).arg(ev-globalPosition().x()).arg(ev-globalPosition().y());//.arg() 是 Qt 的 QString 类的字符串格式化方法。它用于将参数插入到字符串的占位符中。 qDebug() str; return true; } } return QWidget::eventFilter(object,event); } MainWindow::~MainWindow() { delete ui; }结果分析①事件过滤器函数、事件分发器函数和鼠标移动事件函数同时存在的情况下事件过滤器函数发挥作用。②事件分发器函数和鼠标移动事件函数同时存在的情况下事件分发器函数发挥作用。五、查漏补缺1.格式化字符串的使用方法QString str QString(鼠标释放了 x %1 y %2 glabolx %3 glaboly %4).arg(ev-pos().x()).arg(ev-pos().y()).arg(ev-globalPosition().x()).arg(ev-globalPosition().y());2.类型转换//类型转换 基本类型转换 double d 3.14; int i static_castint(d); // i 3 类层次结构中的上行转换安全 class Base {}; class Derived : public Base {}; Derived derived; Base* basePtr static_castBase*(derived); // 安全派生类→基类 类层次结构中的下行转换 class Base { virtual void foo() {} }; // 必须有虚函数 class Derived : public Base {}; Base basePtr; Derived* derivedPtr dynamic_castDerived*(basePtr);

相关新闻

rk3568-linux5.10-buildroot系统新增分区方法

rk3568-linux5.10-buildroot系统新增分区方法

本文章主要实现通过源码新增ccc分区,如需要将应用或文件存放到特定分区下可参考以下方法新增分区。1、修改源码目录下的/tools/linux/Linux_Pack_Firmware/rockdev/rk356x-package-file文件新增ccc分区2、用以下命令在源码/rockdev路径下新建ccc.imgdd if/dev/zero …

2026/7/6 15:21:53 阅读更多 →
DDD如何指导微服务设计实现?——从拆分原则到代码落地

DDD如何指导微服务设计实现?——从拆分原则到代码落地

一、引言在前几篇文章中,我们已经完整走过了DDD的整个知识体系:战术设计:实体、值对象、聚合、领域服务、仓库、工厂、防腐层战略设计:领域、子域、限界上下文、统一语言、上下文地图建模实践:事件风暴会议、支付风控系…

2026/5/17 11:06:28 阅读更多 →
Lua遇到的问题

Lua遇到的问题

1.1ipairs和pairs区别pairs:遍历表中所有的Key,可以返回nil,比较常用。解释:遍历表中的所有键值对,包括数组部分和哈希部分。它会遍历所有不为 nil 的元素,但不保证遍历顺序(具体顺序取决于底层…

2026/7/4 10:49:08 阅读更多 →

最新新闻

实战解析:高效构建Suno AI音乐生成API的完整指南

实战解析:高效构建Suno AI音乐生成API的完整指南

实战解析:高效构建Suno AI音乐生成API的完整指南 【免费下载链接】Suno-API Create Music in Seconds with SunoAPI. 项目地址: https://gitcode.com/GitHub_Trending/su/Suno-API Suno-API是一个基于Python和FastAPI的非官方音乐生成API服务,专…

2026/7/6 18:40:19 阅读更多 →
Docker Compose部署docker-http-https-echo最佳实践:完整配置指南

Docker Compose部署docker-http-https-echo最佳实践:完整配置指南

Docker Compose部署docker-http-https-echo最佳实践:完整配置指南 【免费下载链接】docker-http-https-echo Docker image that echoes request data as JSON; listens on HTTP/S, useful for debugging. 项目地址: https://gitcode.com/gh_mirrors/do/docker-htt…

2026/7/6 18:38:17 阅读更多 →
Docker管理新革命:Dockge可视化容器编排完整指南

Docker管理新革命:Dockge可视化容器编排完整指南

Docker管理新革命:Dockge可视化容器编排完整指南 【免费下载链接】dockge A fancy, easy-to-use and reactive self-hosted docker compose.yaml stack-oriented manager 项目地址: https://gitcode.com/GitHub_Trending/do/dockge 厌倦了复杂的Docker命令行…

2026/7/6 18:36:14 阅读更多 →
终极指南:如何用Serial-Studio让串行数据“开口说话“?[特殊字符]

终极指南:如何用Serial-Studio让串行数据“开口说话“?[特殊字符]

终极指南:如何用Serial-Studio让串行数据"开口说话"?🚀 【免费下载链接】Serial-Studio Open-source telemetry dashboard. Supports UART, BLE, MQTT, Modbus, CAN Bus and more. 项目地址: https://gitcode.com/GitHub_Trendi…

2026/7/6 18:36:14 阅读更多 →
【Java毕业设计】基于 SpringBoot 的大学生运动会报名成绩管理系统的设计与实现 基于前后端分离的高校体育赛事组织管理系统(源码+文档+远程调试,全bao定制等)

【Java毕业设计】基于 SpringBoot 的大学生运动会报名成绩管理系统的设计与实现 基于前后端分离的高校体育赛事组织管理系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/6 18:34:13 阅读更多 →
Halcon 像素当量标定:5个常见误区与3步精度验证方案

Halcon 像素当量标定:5个常见误区与3步精度验证方案

Halcon 像素当量标定:5个常见误区与3步精度验证方案在工业视觉检测项目中,像素当量标定的准确性直接影响着尺寸测量的精度。许多工程师完成标定后,常对结果可靠性存疑——标定板倾斜5会带来多大误差?标定参数在不同位置能否保持一…

2026/7/6 18:32:10 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻