Qt使用星空图作为窗口背景,点击键盘的WASD控制小飞机在上面移动。

事件函数的使用依托于Qt的事件机制,一个来自于外部事件的传递机制模型如下所示

信号槽虽然好用,但是无法包含所有的情况,事件函数可以起到对信号槽无法覆盖的一些时机进行补充,事件函数的使用无需连接。

常用的事件函数如下所示。

// 绘制事件

void QWidget::paintEvent(QPaintEvent * event) [virtual protected]

// 大小改变事件

void QWidget::resizeEvent(QResizeEvent * event) [virtual protected]

// 鼠标按压事件

void QWidget::mousePressEvent(QMouseEvent * event) [virtual protected]

// 鼠标释放事件

void QWidget::mouseReleaseEvent(QMouseEvent * event) [virtual protected]

// 鼠标双击事件

void QWidget::mouseDoubleClickEvent(QMouseEvent * event) [virtual protected]

// 鼠标移动事件

void QWidget::mouseMoveEvent(QMouseEvent * event) [virtual protected]

// 移动事件

void QWidget::moveEvent(QMoveEvent * event) [virtual protected]

// 按键按压事件

void QWidget::keyPressEvent(QKeyEvent * event) [virtual protected]

// 按键释放事件

void QWidget::keyReleaseEvent(QKeyEvent * event) [virtual protected]

// 获取焦点事件

void QWidget::focusInEvent(QFocusEvent * event) [virtual protected]

// 失去焦点事件

void QWidget::focusOutEvent(QFocusEvent * event) [virtual protected]

// 关闭事件

void QWidget::closeEvent(QCloseEvent * event) [virtual protected]

// 进入事件

void QWidget::enterEvent(QEvent * event) [virtual protected]

// 离开事件

void QWidget::leaveEvent(QEvent * event) [virtual protected]

QPaintDevice类表示可绘制设备,其派生类均可以被QPainter类绘制。

示例代码:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include<QDebug>
#include<QPixmap>//图片类
#include<QPainter>//画家类
#include<QKeyEvent>//键盘事件参数
namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
protected:
    //声明事件函数 虚函数
    void paintEvent(QPaintEvent *event);
    void keyPressEvent(QKeyEvent *event);

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}
//定义事件函数
void Dialog::paintEvent(QPaintEvent * event)
{
    //输出窗口宽高
    qDebug()<<this->width()<<this->height();
    //创建画家类对象
    QPainter painter(this);
    QPixmap pic(":/new/prefix1/ikun.jpg");
    //绘制图片函数
    //void	drawPixmap(int x, int y, int width, int height, const QPixmap & pixmap)
    //参数:横坐标 纵坐标 宽度 高度  图片内容
    //设置随主窗口大小改变而变化
    painter.drawPixmap(0,0,this->width(),this->height(),pic);

}
//所有的事件函数的参数都包含了当前类型事件的参数信息
void Dialog::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_A)
    {
        //获得当前进度条的值
        int value=ui->progressBar->value();
        //减少进度条的值
        ui->progressBar->setValue(--value);
    }else if(event->key()==Qt::Key_D)
    {
        //获得当前进度条的值
        int value=ui->progressBar->value();
        //增加进度条的值
        ui->progressBar->setValue(++value);
    }
}

练习:键盘WASD控制飞机移动

使用星空图作为窗口背景,点击键盘的WASD控制小飞机在上面移动。

如果小飞机触碰到窗口边缘,弹出Q事件函数--实例:使用星空图作为窗口背景,点击键盘的WASD控制小飞机在上面移动。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include<QDebug>
#include<QPixmap>
#include<QPainter>
#include<QKeyEvent>
#include<QMessageBox>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
protected:
    void paintEvent(QPaintEvent *event);
    void keyPressEvent(QKeyEvent *event);
private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    QSize size(ui->labelImg->width(),ui->labelImg->height());
    QPixmap pic(":/new/prefix1/plane.png");
    pic = pic.scaled(size,Qt::KeepAspectRatioByExpanding);
    ui->labelImg->setPixmap(pic);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPixmap pic(":/new/prefix1/star.png");
    painter.drawPixmap(0,0,width(),height(),pic);

}

void Dialog::keyPressEvent(QKeyEvent *event)
{
    //获取飞机当前位置
    int x=ui->labelImg->x();
    int y=ui->labelImg->y();
    qDebug()<<ui->labelImg->x()<<ui->labelImg->y();//160 120
     if(event->key()==Qt::Key_W)   //向上移动
     {
        ui->labelImg->move(x,y-5);

     }else if(event->key()==Qt::Key_A)  //向下移动
     {

         ui->labelImg->move(x-5,y);

     }else if(event->key()==Qt::Key_S)  //向左移动
     {

         ui->labelImg->move(x,y+5);

     }else if(event->key()==Qt::Key_D)  //向右移动
     {

         ui->labelImg->move(x+5,y);
     }
     if((x<=0||x>=width()-30)||(y<=0||y>=height()-30))//飞机坠毁边距
     {
         QMessageBox::critical(this,"失败","飞机已坠毁");
         ui->labelImg->move(200,150);//坠毁重生位置
     }
}

dialog.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QLabel" name="labelImg">
   <property name="geometry">
    <rect>
     <x>160</x>
     <y>120</y>
     <width>30</width>
     <height>30</height>
    </rect>
   </property>
   <property name="text">
    <string/>
   </property>
   <property name="pixmap">
    <pixmap resource="res.qrc">:/new/prefix1/plane.png</pixmap>
   </property>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources>
  <include location="res.qrc"/>
 </resources>
 <connections/>
</ui>

实现效果

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Mysql实战】使用存储过程和计算同比环比

背景 同环比&#xff0c;是基本的数据分析方法。在各类调研表中屡见不鲜&#xff0c;如果人工向前追溯统计数据&#xff0c;可想而知工作量是非常大的。 标题复制10行&#xff0c;并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比…

vite跨域问题,你可能需要看这篇文章

最近在学习项目的时候&#xff0c;使用了vite工具进行构建&#xff0c;然后出现了跨域的问题&#xff0c;中间的曲折不过多叙述&#xff0c;直接进入正题。 前端成功启动后的界面&#xff1a; 然后在后端进行的Controller上使用了如下的配置 然后浏览器就会出现跨域的问题 为什…

【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

UE4及Airsim安装时遇到的问题及解决办法

UE4及Airsim安装时遇到的问题及解决办法 目录 UE4及Airsim安装时遇到的问题及解决办法前言UE4下载慢解决方法 Airsim编译过程中提示&#xff1a;无法打开包括文件: “Eigen/Dense”: No such file or directory [D:\software\Visual_studio2022\2022Community\AirSim\Air解决办…

别不信:这些细节关乎你的物联网设备的命运!

《高并发系统实战派》-- 值得拥有 一、设备接入层网络协议的意义 随着物联网的发展&#xff0c;越来越多的设备需要接入云平台进行远程监控和管理。设备接入层网络协议起到了承担设备接入网络的功能&#xff0c;为物联网平台提供了数据交互的基础。设备接入层网络协议对于物联…

【云原生概念和技术】1.2 云原生技术概括(上)

如果想了解或者学习云原生的友友们&#xff0c;欢迎订阅哦&#xff5e;&#x1f917;&#xff0c;目前一周三更&#xff0c;努力码字中&#x1f9d1;‍&#x1f4bb;…目前第一章是一些介绍和概念性的知识&#xff0c;可以先在脑海里有一个知识的轮廓&#xff0c;从第二章开始就…

AUTOSAR入门

简介 AUTOSAR&#xff08;AUTomotive Open System ARchitecture&#xff09;是一种汽车软件架构标准&#xff0c;由德国大陆、博世、宝马等汽车及零部件制造商共同发起&#xff0c;拥有广泛的行业参与。其目标是为了解决汽车电子和软件系统日益复杂的问题&#xff0c;提高可重…

打工人使用ChatGPT的一天!

众所周知&#xff0c;ChatGPT 自去年OpenAI 推出以来&#xff0c;这款 AI 聊天机器人可以说迅速成为了 AI 界的「当红炸子鸡」 作为一名资深的打工人&#x1f477;&#x1f3fb;‍♂️&#xff0c;我们应该怎样利用ChatGPT提高工作效率呢&#xff1f;今天给大家介绍下打工人使…

关于Kerberos认证的一些攻击手法学习总结

Kerberos认证流程 前言 本文主要分享最近学习的关于域内Kerberos认证的一些攻击手法&#xff0c;以自我的理解为主&#xff0c;从原理理解切入到基本工具利用来阐述&#xff0c;个人的理解分析较为啰嗦&#xff0c;嫌太兀长的可以跳着看就好&#xff0c;还请各位谅解。如有错误…

第三十二章 React路由组件的简单使用

1、NavLink的使用 一个特殊版本的 Link&#xff0c;当它与当前 URL 匹配时&#xff0c;为其渲染元素添加样式属性 <NavLink className"list-group-item" to"/home">Home</NavLink> <NavLink className"list-group-item" to&quo…

JVM运行时数据区

Java和C的区别&#xff0c;体现在自动内存分配和垃圾收集技术。 JVM在执行Java程序时&#xff0c;会将它管理的内存分为若干个不同的数据区域。 这些区域有各自的作用范围以及生命周期&#xff1a; 线程私有的区域&#xff0c;随着用户线程的启动和结束而建立和销毁。线程共…

2023网络安全十大顶级工具

从事网络安全工作&#xff0c;手上自然离不开一些重要的网络安全工具。今天&#xff0c;分享10大网络安全工具。 一、Kali Linux Kali 是一个基于 Debian 的 Linux 发行版。它的目标就是为了简单&#xff1a;在一个实用的工具包里尽可能多的包含渗透和审计工具。Kali 实现了这…

MySQL基础(二十二)逻辑架构

1.逻辑架构剖析 1.1 第1层&#xff1a;连接层 系统&#xff08;客户端&#xff09;访问MySQL服务器前&#xff0c;做的第一件事就是建立TCP连接。 经过三次握手建立连接成功后&#xff0c;MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。 用户名或密码不对&#…

Redis 五大基本数据类型常见命令

一、redis中的常见数据结构 Redis共有5种常见数据结构&#xff0c;分别字符串&#xff08;STRING)、列表&#xff08;LIST&#xff09;、集合&#xff08;SET)、散列&#xff08;HASH&#xff09;、有序集合&#xff08;ZSET)。 二、redis中五大基本数据类型介绍 字符串(Str…

尚硅谷JUC

文章目录 1. 什么是JUC1.1 JUC简介1.2 进程和线程基本概念2.1 Synchronized2.1.1 Synchronized关键字2.1.2 synchronized实现三个线程卖30张票 2.2 Lock2.2.1 什么是Lock2.2.2 使用Lock实现买票功能2.2.3 两者的区别 3. 线程间通信及定制化通信3.1 使用synchronized实现线程之间…

Hive语言

一、Hive的DDL语言&#xff08;数据库、数据表的增删改查操作) 二、Hive的DQL语言&#xff08;数据库查询语言&#xff09; 2.1Hive七子句 聚合函数&#xff1a;count()、sum()、max()、min()、avg()可以单独使用。(缩写&#xff1a;cs mm a) 2.1.1 分区查询与分区裁剪 SELEC…

女生学习软件测试怎么样?

在IT技术行业&#xff0c;女生学习还是有很大优势的。女生相较于男生更有耐心&#xff0c;包容性强&#xff0c;心思细腻&#xff0c;对细节把控更好&#xff0c;同时还能帮助团队男女平衡&#xff0c;活跃气氛。 编程是一个只要你肯学习就会有回报的行业&#xff0c;不论男生…

ResourceManager HA 原理

简介 为了解决 Yarn 中 ResourceManager 的单点故障问题&#xff0c;在 Hadoop 2.4 中新增了 ResourceManager HA 的能力&#xff0c; 该文章基于 Hadoop 3.1.1 进行讲解。 1.1. 名词定义 全称简称备注ResourceManagerRmZookeeperZK ResourceManager Ha 架构 ResourceMana…

前端工程化 搭建私有组件库 组件从开发到发布私有npm仓库的全过程

前言 基于Vue3.0 TS的组件从开发组件库到发布私有npm仓库的全过程 环境 这里列出本文所使用的环境版本 vue 3.0 vue/cli 4.5.9 nodeJs 14.15.1 npm 6.14.8 vue --version vue/cli 4.5.9 npm -v 6.14.8 node -v v14.15.1 步骤 创建项目 使用 vue-cli 创建一个 vue3 项目&a…

mysql的高级查询语句

1.本文前言 数据库是用来存储数据&#xff0c;更新&#xff0c;查询数据的工具&#xff0c;而查询数据是一个数据库最为核心的功能&#xff0c;数据库是用来承载信息&#xff0c;而信息是用来分析和查看的。所以掌握更为精细化的查询方式是很有必要的。本文将围绕数据的高级查…