QT的核心机制 对话框资源

news2024/11/27 4:40:29

案例

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

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

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

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

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

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_OBJECT

public:
    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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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.coloradmin.cn/o/2204645.html

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

相关文章

C语言 ——— oj题:有效的括号

目录 题目要求 代码实现 题目要求 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个…

【靶点Talk】为什么联合用药喜欢用VEGF+VEGFR?

血管生成对肿瘤发生、发展的重要影响的发现&#xff0c;使肿管生成变为肿瘤研究的热点之一。今天给大家带来VEGF、VEGFR相关介绍&#xff0c;更多靶点科普视频请关注义翘神州B站和知乎官方账号。 1、VEGFR的“简历” VEGFR包括VEGFR-1、VEGFR-2和VEGFR-3。VEGFR-2可与多种VEGF…

leetcode hot100_part03_滑动窗口

滑动窗口是有一个基本的模版的&#xff0c;不要自己想当然哦~ 滑动窗口算法思想&#xff08;附经典例题&#xff09;_滑动窗口的思想-CSDN博客 滑动窗口也叫同向双指针&#xff1b;可以先看一下灵山视频&#xff1a;滑动窗口【基础算法精讲 03】_哔哩哔哩_bilibili 3.无重复字…

springboot如何自动生成mybatis映射文件、dao、pojo层文件?

背景&#xff1a;以前一直是直接cv一个项目中现成的xml文件&#xff0c;然后再去自己配置mapper等数据。自己准备做一个单独的例子试一下。 步骤1&#xff1a;在pom.xml文件中插入mybatis-generator插件&#xff0c;这里选的版本是1.3.2&#xff0c;然后指定的generator文件是在…

ChatGPT 4o with Canvas — 新特性详解

# ChatGPT 4o with Canvas — 新特性详解 最近猫哥也感受到 Canvas 的强大&#xff0c;顺手开了个会员体验了一天&#xff0c;今天给大家简单分享一下&#xff0c;有想体验的伙伴可以文末名片私信我哈&#xff01; 关键词&#xff1a; #ChatGPT4o #Canvas新特性 #AI写作工具 …

[论文笔记]DAPR: A Benchmark on Document-Aware Passage Retrieval

引言 今天带来论文DAPR: A Benchmark on Document-Aware Passage Retrieval的笔记。 本文提出了一个基准&#xff1a;文档感知段落检索(Document-Aware Passage Retrieval,DAPR)以及介绍了一些上下文段落表示的方法。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c…

Best HTTP V3

Best HTTP是Unity的权威网络解决方案,专为需要多功能性和强大功能的开发人员而设计。它与Unity 2021.1及更高版本无缝兼容,提供无与伦比的跨平台支持,包括桌面、移动设备、UWP和Web浏览器。凭借其高级功能集,它超越了基本的HTTP请求,支持HTTPS、HTTP/2,并通过传统的回调、…

2024年10月11日历史上的今天大事件早读

1038年10月11日李元昊称帝&#xff0c;国号大夏&#xff0c;西夏建立 1086年10月11日北宋政治家、史学家司马光逝世 1889年10月11日英国物理学家焦耳逝世 1900年10月11日李鸿章开始与八国联军的艰难谈判 1937年10月11日淞沪战线大场之战爆发 1944年10月11日日军包围桂林 …

The 2024 ICPC Kunming Invitational Contest K. Permutation(交互 期望)

在知乎内查看 题目 思路来源 题解 首先特判n1的情况&#xff0c;其实也不用问 分治&#xff0c;假设当前解决到[l,r]&#xff0c;要递归的vector是x&#xff0c; 维护两个vector L、R&#xff0c;代表下一步要在[l,mid]和[mid1,r]分治的vector 每次将x random_shuffle后&a…

网络安全 IP地址防泄漏指南

IP地址作为每个上网人的“门牌标识号”&#xff0c;如果产生泄露&#xff0c;可能会导致个人行踪曝光、数据被窃取甚至遭受网络攻击&#xff0c;要防止IP地址不被窃取&#xff0c;我们可以尝试以下方法&#xff1a; 利用专用网络加强隐私保护 通过加密在公共网络上创建一条安全…

力扣 前缀和

找子数组的个数了解前缀和的基础。 前缀和大致理解为到达某个位置&#xff0c;前面几个数的总和&#xff0c;即s[i1]s[i]a[i1]&#xff0c;可以通过一次循环获得。然后几个前缀和作差&#xff0c;即可得到某个位置到某个位置的和&#xff0c;根据map的键值对进行更新次数。 题…

博客项目自动化测试(一)

1. 确认博客系统的环境搭建 http://49.235.129.183:8080/java109_blog_system/blog_list.html&#xff0c;即可访问我的小项目&#xff1b; 2. 确定测试用例 测试用例如下所示&#xff1a; 3. 关于登录的测试用例 3.1 初始化和退出浏览器 代码如下&#xff1a; package Blo…

查缺补漏----二进制指数退避算法的流程

具体为以下几步&#xff1a; 例题&#xff1a; ① 争用时间片2t51.2us ② kmin{重传次数&#xff0c;10}&#xff0c;题目说4次冲突&#xff0c;所以k为4&#xff0c;对应参数集合为&#xff1a; {0&#xff0c;1&#xff0c;2&#xff0c;......} ③ 等待的最长时间&#xff1…

PHP学习记录-编辑器推荐和本地环境的安装

文章目录 一&#xff0c;编辑器首推VSCode1&#xff0c;vscode2&#xff0c;PHPStorm 二&#xff0c;PHP环境搭建1&#xff0c;下载安装2&#xff0c;使用phpstudy创建站点3&#xff0c;答疑解惑 一&#xff0c;编辑器首推VSCode 1&#xff0c;vscode 对于PHP新手来说&#x…

育菁实验室用桌面级CNC加工中心

桌面级CNC加工中心的发展可以追溯到数控技术的兴起。随着数控机床技术的不断进步&#xff0c;小型化、桌面化的加工中心逐渐成为可能。特别是近年来&#xff0c;随着智能制造、工业4.0等概念的提出&#xff0c;桌面级加工中心因其灵活、高效、占地面积小等特点&#xff0c;受到…

【GT240X】【3】Wmware17和Centos 8 安装

文章目录 一、说明二、安装WMware2.1 下载WMware2.2 安装2.3 虚拟机的逻辑结构 三、安装Centos3.1 获取最新版本Centos3.2 创建虚拟机 四、问题和简答4.1 centos被淘汰了吗&#xff1f;4.2 centos里面中文显示成小方块的解决方法4.3 汉语-英语输入切换4.4 全屏和半屏切换 五、练…

【Ubuntu】在Ubuntu上配置Java环境

【Ubuntu】在Ubuntu上配置Java环境 壹、前言 Java是运用得非常广泛的编程语言&#xff0c;在使用Linux时难免会碰到需要用到JDK的情况&#xff0c;故本文介绍如何在Ubuntu上配置Java21环境。 贰、下载 Java的下载渠道很多&#xff0c;有甲骨文公司的“官方”JDK&#xff0c…

2024年第四届机器人、自动化和人工智能国际会议(RAAI 2024)即将召开!

学术会议查询-学术会议交流服务平台-爱科会易 (uconf.com)https://www.uconf.com/ 第四届机器人、自动化和人工智能国际会议&#xff08;RAAI 2024&#xff09;将于 2024 年 12 月 19-21 日在新加坡举行。会议旨在为研究人员、从业人员和行业专家提供一个平台&#xff0c;分享他…

ubuntu安装好后网络里面没有有线网卡连接 已解决

装好ubuntu18.04.6后&#xff0c;发现网络配置里面没有有线网卡连接&#xff0c;怀疑是有线网卡驱动没有安装或者是安装好的有线网卡驱动跟硬件不匹配。网络上搜索了半天&#xff0c;最终是这篇文章解决了我的问题&#xff1a;https://juejin.cn/post/7155368447243714574。简单…

【JAVA+flowable】工作流 实现抄送节点

由于flowable并没有 抄送节点 这一节点类型 只能在审核中添加抄送人, 但客户有此需求。所以定制实现此需求 增加一种节点任务类型: 抄送任务 由于flowable并没有 抄送节点 这一节点类型 所以用自带的 空白任务 改造成抄送 实现步骤 1.就是需要获取到 流程当前节点,下一个…