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.mzph.cn/web/55187.shtml

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

相关文章

Midjourney零基础学习

Midjourney学习笔记TOP04 Midjourney的各种参数设置 Midjourney的用户操作界面没有醒目的工具栏、属性栏&#xff0c;所有的操作都是通过调用各种指令和参数进行的。 【MJ Version】 Midjourney在2023年3月份就已经更新到了V5版本&#xff0c;V5版本除了画质有所提升外&#…

interwirelessac9560感叹号,电脑无法连接wifi,无法搜索到wifi

interwirelessac9560感叹号 电脑无法连接wifi&#xff0c;无法搜索到wifi 原因 这可能是wifl模块出现了问题。 解决方案 1、winx 打开&#xff0c;选择【设备管理器】 2、选择网络适配器 右键打开wireless-AC&#xff0c;选择【卸载设备】。 3、关机2分钟后&#xff0c…

SpringBoot智慧外贸平台

专业团队&#xff0c;咨询就送开题报告&#xff0c;欢迎大家私信留言&#xff0c;联系方式在文章底部 摘 要 网络的广泛应用给生活带来了十分的便利。所以把智慧外贸管理与现在网络相结合&#xff0c;利用java技术建设智慧外贸平台&#xff0c;实现智慧外贸的信息化。则对于进…

数据结构-5.9.树的存储结构

一.树的逻辑结构&#xff1a; 二.双亲表示法(顺序存储)&#xff1a; 1.树中除了根结点外每一颗树中的任意一个结点都只有一个父结点(双亲结点)&#xff1b; 2.结点包括结点数据和指针&#xff1b; 3.上述图片中右边的顺序存储解析&#xff1a;比如A结点左边的0&#xff0c;就…

ASML业绩暴雷,股价一度跌超16%

KlipC报道&#xff1a;当地时间10月15日&#xff0c;阿斯麦&#xff08;ASML&#xff09;原定于周三公布的三季度业绩报告由于技术原因被短暂地提前公布&#xff0c;业绩报告显示&#xff0c;阿斯麦第三季度总净销售额75亿欧元&#xff0c;毛利率50.8%&#xff0c;净利润21亿欧…

社招高频面试题

1.单例模式 面试突击50&#xff1a;单例模式有几种写法&#xff1f; 2.Mybatis缓存机制 MyBatis的一、二级缓存查询关系 一级缓存是SqlSession级别&#xff0c;不能跨SqlSession共享&#xff0c;默认开启。 二级缓存是基于mapper namespace级别的&#xff0c;可以跨SqlSessi…

Scala入门基础(10)高级函数

一.什么是高阶函数 二.map函数 三.foreach函数 四.filter函数 五.flatten函数 正文&#xff1a; 一.什么是高阶函数 高阶函数&#xff1a;是一个特殊的函数&#xff0c;特殊之处在于&#xff1a;它指使用其他函数作为参数或返回值 &#xff08;演示&#xff09; 二.map函…

SpringSecurity(一)——认证实现

一、初步理解 SpringSecurity的原理其实就是一个过滤器链&#xff0c;内部包含了提供各种功能的过滤器。 当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。 核心过滤器&#xff1a; &#xff08;认证&#xff09;UsernamePasswordAuthenticationFilter:负责处理…

python yolov8半自动标注

首先标注一部分图片&#xff0c;进行训练&#xff0c;生成模型&#xff0c;标注文件为xml方便后面统一做处理。 1、标注数据&#xff08;文件为xml, 转为txt用于训练&#xff0c;保留xml标签文件&#xff09; 2、模型训练&#xff08;训练配置、训练代码、&#xff09; 3、使用…

极狐GitLab 发布安全补丁版本 17.4.1、17.3.4、17.2.8

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

[已解决]DockerTarBuilder永久解决镜像docker拉取异常问题

前阵子发现阿里云的docker加速镜像失效了&#xff08;甚至连nginx都拉取不了&#xff09;&#xff0c;重新换了并且加多了网络上比较常用的dokcer加速源&#xff0c;可以解决一部分问题&#xff0c;但仍然有一些镜像的某个版本或一些比较冷的镜像就是拉取不了&#xff0c;原因未…

『网络游戏』数据库表格转储【25】

避免勿删数据库表格&#xff0c;可以将表格存储 放到桌面即可 现在将表格删除后点击 浏览桌面表格保存即可 修改客户端脚本&#xff1a;NetSvc.cs 目的是在数据库更新异常时弹出提示以便修改 本章结束

进程间通信、无名管道、有名管道

一、进程 1.1 进程间通信的概念 线程通信通过全局变量即可。 进程间通信是相互独立的&#xff0c;但是所有进程都共用一份内核空间&#xff0c;所以进程和进程之间的通信可以通过内核去进行。 1.2 进程间通信方式 共7种: 传统的进程间通信方式&#xff1a; 无名管道有名管道…

VSCode 查看 Git 的历史记录的三种技巧

前言 在我们日常开发工作过程中&#xff0c;可能经常会看到一些离谱的历史代码&#xff0c;或者当项目发生线上事故时&#xff0c;如何快速定位是谁提交的代码导致的&#xff1f; 作为前端开发者&#xff0c;VSCode 是目前最为流行的代码编辑工具&#xff0c;也是日常最常打开…

OPC UA与PostgreSQL如何实现无缝连接?

随着工业4.0的推进&#xff0c;数据交换和集成在智能制造中扮演着越来越重要的角色。OPC UA能够实现设备与设备、设备与系统之间的高效数据交换。而PostgreSQL则是一种强大的开源关系型数据库管理系统&#xff0c;广泛应用于数据存储和管理。如何将OPC UA与PostgreSQL结合起来&…

python pip安装requirements.txt依赖与国内镜像

python pip安装requirements.txt依赖与国内镜像 如果网络通畅&#xff0c;直接pip安装依赖&#xff1a; pip install -r requirements.txt 如果需要国内的镜像&#xff0c;可以考虑使用阿里的&#xff0c;在后面加上&#xff1a; -i http://mirrors.aliyun.com/pypi/simple --…

基于System.js的微前端实现(插件化)

目录​​​​​​​ 写在前面 一、微前端相关知识 &#xff08;一&#xff09;概念 &#xff08;二&#xff09; 优势 &#xff08;三&#xff09; 缺点 &#xff08;四&#xff09;应用场景 &#xff08;五&#xff09;现有框架 1. qiankun 2. single-spa 3. SystemJ…

GO之流程控制

一、流程控制简述 一&#xff09;流程控制的作用 流程控制语句是用来控制程序中语句执行顺序的语句&#xff0c;可以把语句组合成能完成一定功能的小逻辑块 二&#xff09;流程控制的分类 控制语句分为三类&#xff1a;顺序、选择和循环 顺序结构&#xff1a;依次执行&#xf…

通过Express + Vue3从零构建一个用户认证与授权系统(二)数据库与后端项目搭建与实现

前言 上一篇完成了系统的相关设计文档的编写&#xff0c;本文将详细介绍如何一步步使用 TypeScript 和 Express 搭建一个模块化、类型安全的用户认证与授权系统&#xff0c;包括数据库设计、后端项目搭建、用户认证、角色与权限管理、错误处理以及 Swagger 文档集成。 项目准…

Label Studio 半自动化标注

引言 Label Studio ML 后端是一个 SDK,用于包装您的机器学习代码并将其转换为 Web 服务器。Web 服务器可以连接到正在运行的 Label Studio 实例,以自动执行标记任务。我们提供了一个示例模型库,您可以在自己的工作流程中使用这些模型,也可以根据需要进行扩展和自定义。 1…