QT的核心机制 对话框资源

案例

1、键盘按下w,s,a,d键分别为标签向上,下,左,右移动

鼠标按下获取本地坐标,全局坐标

鼠标双击获取本地坐标,全局坐标

鼠标移动获取本地坐标,全局坐标

让鼠标跟踪坐标,需要手动开启,标签会随着鼠标移动

widget.h代码

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();protected:// 确保使用 override 关键字void keyPressEvent(QKeyEvent *event) override;             //声明键盘按下事件处理函数void keyReleaseEvent(QKeyEvent *event) override;            //声明键盘抬起事件处理函数void mousePressEvent(QMouseEvent *event) override;            //鼠标按下事件处理函数的声明void mouseReleaseEvent(QMouseEvent *event) override;          //鼠标抬起事件处理函数void mouseDoubleClickEvent(QMouseEvent *event) override;          //鼠标双击事件处理函数void mouseMoveEvent(QMouseEvent *event) override;            //鼠标移动事件的声明private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp代码

#include "widget.h"
#include "ui_widget.h"
#include <QtDebug>
#include <QKeyEvent>    //键盘事件Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//如果需要让鼠标跟踪坐标,需要手动开启this->setMouseTracking(true);}
Widget::~Widget()
{delete ui;
}//重写键盘按下事件处理函数
void Widget::keyPressEvent(QKeyEvent *event)
{
//    static int num = 1;
//    qDebug() << "num = " << num++;//qDebug() << event->text() << "被按下,对应的键值为: " << event->key();//对用户按下的健进行判断switch(event->key()){//向上移动case 'W':case 'w':{//判断是否已经到界面外部了if(ui->label->y() <= -ui->label->height()){//将组件移动到界面的最下面ui->label->move(ui->label->x(),this->height());}//让组件向上移动10格ui->label->move(ui->label->x(),ui->label->y()-10);}break;//向下移动case 'S':case 's':{if(ui->label->y() >= this->height()){ui->label->move(ui->label->x(),-ui->label->height());}ui->label->move(ui->label->x(),ui->label->y()+10);}break;//向左移动case 'A':case 'a':{if(ui->label->x() <= -ui->label->width()){ui->label->move(this->width(),ui->label->y());}ui->label->move(ui->label->x()-10,ui->label->y());}break;//向右移动case 'D':case 'd':{if(ui->label->x() >= this->width()){ui->label->move(-ui->label->width(),ui->label->y());}ui->label->move(ui->label->x()+10,ui->label->y());}break;}
}//键盘抬起事件处理函数的定义
void Widget::keyReleaseEvent(QKeyEvent *event)
{qDebug() << event->text() <<"被按下,对应的键值为:"<<event->key();
}//鼠标按下事件处理函数
void Widget::mousePressEvent(QMouseEvent *event)
{//判断是哪个鼠标键按下if(event->button() == Qt::LeftButton){qDebug() << "鼠标左键被按下了";}else if(event->button() == Qt::RightButton){qDebug() << "鼠标右键被按下了";}else if(event->button() == Qt::MidButton){qDebug() << "鼠标中键被按下了";}
}//键盘抬起事件处理函数的定义
void Widget::mouseReleaseEvent(QMouseEvent *event)
{//判断是哪个鼠标键按下if(event->button() == Qt::LeftButton){qDebug() << "鼠标左键被抬起,本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();}else if(event->button() == Qt::RightButton){qDebug() << "鼠标右键被抬起,本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();}else if(event->button() == Qt::MiddleButton){qDebug() << "鼠标中键被抬起,本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();}
}//鼠标双击事件处理函数的定义
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{//判断是哪个鼠标键按下if(event->button() == Qt::LeftButton){qDebug() << "鼠标左键被双击,本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();}else if(event->button() == Qt::RightButton){qDebug() << "鼠标右键被双击,本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();}else if(event->button() == Qt::MiddleButton){qDebug() << "鼠标中键被双击,本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();}
}//鼠标移动事件的定义
void Widget::mouseMoveEvent(QMouseEvent *event)
{//判断是哪个鼠标键按下if(event->button() == Qt::LeftButton){qDebug() << "鼠标左键被双击,本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();}else if(event->button() == Qt::RightButton){qDebug() << "鼠标右键被双击,本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();}else if(event->button() == Qt::MiddleButton){qDebug() << "鼠标中键被双击,本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();}qDebug() << "本地坐标:" << event->pos() << "鼠标左键被抬起,全局坐标:" << event->globalPos();ui->label->move(event->x()-ui->label->width()/2,event->y()-ui->label->height()/2);
}

运行效果

2、使用鼠标移动事件完成界面的移动

widget.h代码

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPoint>   //点类
#include <QMouseEvent>  //鼠标事件QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void mousePressEvent(QMouseEvent *event) override;        //鼠标点击事件void mouseMoveEvent(QMouseEvent *event) override;          //鼠标移动事件private:Ui::Widget *ui;QPoint temp;           //辅助向量
};
#endif // WIDGET_H

widget.cpp代码

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//去除头部this->setWindowFlag(Qt::FramelessWindowHint);
}Widget::~Widget()
{delete ui;
}void Widget::mousePressEvent(QMouseEvent *event)    //鼠标点击事件
{temp = event->globalPos() - this->pos();    //得到中间向量//鼠标的当前位置        组件左上角的位置}void Widget::mouseMoveEvent(QMouseEvent *event)     //鼠标移动事件
{if(event->button() == Qt::LeftButton){this->move(event->globalPos()- temp);   //组件移动位置}else if(event->button() == Qt::RightButton){this->close();}
}

运行效果

知识梳理

QT的核心机制

对话框资源

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

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

相关文章

leetcode128最长连续序列 golang版

题目描述 题目&#xff1a;给定一个未排序的整数数组 nums 找出数字连续的最长序列&#xff0c;不要求序列 元素在原数组中连续 的长度 请你设计并实现时间复杂度为On的算法解决此问题 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解释&…

前端入门学习之css盒子原则

文章目录 前端入门学习之css盒子原则引入块级元素&#xff1a;块级元素的特点占据整行设置高度和宽度包含其他元素 盒子原则&#xff1a;margin&#xff1a;例子&#xff1a; boder&#xff1a;padding&#xff1a; 前端入门学习之css盒子原则 引入块级元素&#xff1a; 当一…

Spring Boot知识管理系统:创新与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

MySQL-约束Constraint详解

文章目录 约束简介非空约束检查约束唯一约束列级约束与表级约束给约束起名字 主键约束主键概念以及注意事项 外键约束外键概念以及注意事项外键使用场景约束的删除与添加级联相关操作级联删除(on delete cascade)级联更新(on update cascade)级联置空(on delete set null) 约束…

从SQL Server过渡到PostgreSQL:理解模式的差异

前言 随着越来越多的企业转向开源技术&#xff0c;商业数据库管理员和开发者也逐渐面临向PostgreSQL迁移的需求。 虽然SQL Server和PostgreSQL共享许多数据库管理系统&#xff08;RDBMS&#xff09;的基本概念&#xff0c;但它们在处理某些结构上的差异可能会让人感到困惑&…

首届公安影视文化融创发展活动暨龙虎山警察文化交流季圆满收官!

为推动形成公安题材文学创作的全链条发展机制&#xff0c;搭建文化交流的平台&#xff0c;由公安部新闻传媒中心联合江西省鹰潭市人民政府举办的“首届公安影视文化融创发展活动暨龙虎山警察文化交流季”&#xff0c;于10月12日在江西省鹰潭市龙虎山举行专题总结仪式&#xff0…

如何通过构建对应的api服务器使Vue连接到数据库

一、安装数据库驱动 在后端安装 MySQL 数据库驱动&#xff0c;比如在 Node.js 环境中可以使用 mysql2 包来连接 MySQL 数据库。在项目目录下运行以下命令安装&#xff1a; npm install mysql2或者使用 yarn&#xff1a; yarn add mysql2二、创建数据库连接模块 创建一个专门…

Linux shellcheck工具

安装工具 通过linux yum源下载&#xff0c;可能因为yum源的问题找不到软件包&#xff0c;或者下载的软件包版本太旧。 ShellCheck的源代码托管在GitHub上(推荐下载方式)&#xff1a; GitHub - koalaman/shellcheck: ShellCheck, a static analysis tool for shell scripts 对下…

STM32传感器模块编程实践(八) HX711压力传感器称重模块简介及驱动源码

文章目录 一.概要二.HX711主要技术指标三.HX711模块参考原理图四.模块接线说明五.模块工作原理介绍六.模块通讯协议介绍七.STM32单片机与HX711模块实现重量测量实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 八.小结 一.概要 电子秤是将检测与转换技术、计算机技术、信息…

安装Node.js环境,安装vue工具

一、安装Node.js 去官方网站自行安装自己所需求的安装包 这是下载的官方网站 下载 | Node.js 中文网 给I accept the terms in the License Agreement打上勾然后点击Next 把安装包放到自己所知道的位置,后面一直点Next即可 等待它安装好 然后winr打开命令提示符cmd 二、安装…

mybatis-plus saveOrUpdate详细解析

mybatis-plus saveOrUpdate详细解析 saveOrUpdate() 方法介绍 插入新记录&#xff1a;当对象的所有字段都为新值且对象的主键字段未设置或设置为默认值时&#xff0c;saveOrUpdate将执行插入操作。更新现有记录&#xff1a;如果对象的主键字段设置了有效的值&#xff0c;并且…

MySQL表的基本查询上

1&#xff0c;创建表 前面基础的文章已经讲了很多啦&#xff0c;直接上操作&#xff1a; 非常简单&#xff01;下一个&#xff01; 2&#xff0c;插入数据 1&#xff0c;全列插入 前面也说很多了&#xff0c;直接上操作&#xff1a; 以上插入和全列插入类似&#xff0c;全列…

一台电脑轻松接入CANFD总线-来可CAN板卡介绍

在工业控制领域&#xff0c;常常使用的总线技术有CAN(FD)、RS-232、RS-485、Modbus、Profibus、Profinet、EtherCAT等。RS-485以其长距离通信能力著称&#xff0c;Modbus广泛应用于PLC等设备&#xff0c;EtherCAT则以其低延迟和高实时性在自动化系统中备受青睐。 其中&#xf…

10.9QT对话框以及QT的事件机制处理

MouseMoveEvent(鼠标移动事件) widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 设置窗口为无边框&#xff0c;去掉标题栏等装饰this->setWi…

Springboot整合抖音小程序获取access-token图片检测V3

抽取配置文件 appId以及secret需要自行在抖音开放平台获取 dy:appId: ttb0xxxxxsecret: 12a19a426xxxxxxxxxxxxx获取access-token 参照文档我们调用此接口需要先获取access-token 获取access-token官方文档地址 注意事项 client_token 的有效时间为 2 个小时&#xff0c;重复获…

CMake 教程(二)添加库

目录 一、实例一——创建库1、add_library2、target_include_directories()、target_link_libraries()2.1 target_include_directories()2.2 target_link_libraries() 3、实例操作 二、实例二——添加选项1、option()2、实例操作 在第一节 CMake 教程&#xff08;一&#xff09…

fastadmin 列表页表格实现动态列

记录&#xff1a;fastadmin 列表页表格实现动态列 后端代码 /*** 商品库存余额表*/public function kucunbalance(){$houseList (new House)->where([shop_id>SHOP_ID])->order(id desc)->field(name,id)->select();//设置过滤方法$this->request->filte…

LeetCode209.长度最小的子数组

题目链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 1.常规解法&#xff08;会超时&#xff09; 可以先将数组的所有子数组求出来&#xff0c;计算其中元素的值&#xff0c;判断与目标值的大小关系&#xff0c;代码如下&#xff1a; public …

Ubuntu里彻底卸载UHD

查看已经安装的UHD版本uhd_find_devices&#xff0c;展示的是当前安装的 UHD 库版本所支持的设备信息&#xff0c;下载了多个版本的uhd但是又记不住安装的位置&#xff0c;想要把所有的uhd相关环境全都删掉&#xff0c;用下边这个命令看一下所有的uhd信息&#xff1a; apt lis…

在 Spring 中使用 @EhCache 注解作为缓存

文章目录 项目概况项目设置一个简单的 RESTful Web 服务Spring 整合 EhCache第 1 步&#xff1a;更新依赖项以使用 EhCache Spring 注解第 2 步&#xff1a;设置自定义缓存管理器第 3 步&#xff1a;配置 EhCache第 4 步&#xff1a;测试缓存 刷新缓存总结推荐阅读文章 EhCache…