Qt键盘事件实现图片在窗口上下左右移动

本文实例为大家分享了Qt键盘事件实现图片在窗口上下左右移动,供大家参考,具体内容如下

标签(空格分隔): 键盘事件

一、项目内容:

新建桌面应用程序testKeyEvent,类名KeyEvent,基类QWidget,通过重写键盘事件到达操作的键盘的时候窗口中的图片上下左右移动,类似QtCreator设计模式下通过按键摆放部件时的效果。

二、实现细节

  • keyevent.h内容:
#ifndef KEYEVENT_H
#define KEYEVENT_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class keyEvent; }
QT_END_NAMESPACE

class keyEvent : public QWidget
{
    Q_OBJECT

public:
    keyEvent(QWidget *parent = nullptr);
    ~keyEvent();
    void drawPix();         //自定义成员函数用来在pixmap上绘制网格线和图片
protected:

    void keyPressEvent(QKeyEvent *event) override;      //重写键盘按下事件
    void paintEvent(QPaintEvent *event) override;       //重写绘图事件

private:
    Ui::keyEvent *ui;
    QPixmap *m_pix;
    QImage m_image;
    int m_startX;   //图标顶点的位置
    int m_startY;
    int m_width;    //界面的宽度和高度
    int m_height;
    int m_step;     //图片移动的步长

};
#endif // KEYEVENT_H
  • 构造函数:(初始化窗口大小、pximap、加载图片、要显示图片左上角的坐标)
keyEvent::keyEvent(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::keyEvent)
{
    ui->setupUi(this);
    setWindowTitle("键盘事件");
    setAutoFillBackground(true);
    setFixedSize(512,256);
    m_width=size().width();
    m_height=size().height();

    m_pix=new QPixmap(m_width,m_height);
    m_pix->fill(Qt::white);

    m_image.load("../car.png"); //当前工作目录默认Debug目录下,car.png在上一级目录下
    m_startX=100;
    m_startY=100;
    m_step=20;
    drawPix();
}
  • drawPix():定义Painter对象,并设置画笔(虚线),m_pix作为绘图设备,在上面绘制网格虚线,还有图片的位置信息
void keyEvent::drawPix()
{
    m_pix->fill(Qt::white);
    QPainter painter(this);
    QPen pen(Qt::DotLine); //虚线

    painter.begin(m_pix);   //m_pix为绘图设备
    painter.setPen(pen);

    //按照步长画纵向的网格虚线
    for(int i=m_step;i<m_width;i+=m_step){
        painter.drawLine(QPoint(i,0),QPoint(i,m_height));

    }
    //按照步长画横向的网格虚线
    for(int j=m_step;j<m_height;j+=m_step){
        painter.drawLine(QPoint(0,j),QPoint(m_width,j));
    }
    painter.end();

    //画图片
    painter.begin(m_pix);
    painter.drawImage(QPoint(m_startX,m_startY),m_image);
    painter.end();
}
  • 重写键盘事件

1、按下Ctrl+方向键一次图片移动一个像素的距离
2、普通方向键一次移动步长(m_step:20像素)的距离,ui界面下默认一次移动10个像素

void keyEvent::keyPressEvent(QKeyEvent *event)
{
    //按下ctrl键移动一个像素
    if(event->modifiers()==Qt::ControlModifier){
        if(event->key()==Qt::Key_Left){
            m_startX=(m_startX-1)<0?m_startX:m_startX-1;
        }else if(event->key()==Qt::Key_Right){
            m_startX=(m_startX+1+m_image.width())>m_width?m_startX:m_startX+1;
        }else if(event->key()==Qt::Key_Up){
            m_startY=(m_startY-1)<0?m_startY:m_startY-1;
        }else if(event->key()==Qt::Key_Down){
            m_startY=(m_startY+1+m_image.height())>m_height?m_startY:m_startY+1;
        }
    }else{
        //调整图片左上角的位置到网格顶点
        m_startX=m_startX+m_startX%m_step;
        m_startY=m_startY+m_startY%m_step;
        if(event->key()==Qt::Key_Left){
            m_startX=(m_startX-m_step)<0?m_startX:m_startX-m_step;
        }else if(event->key()==Qt::Key_Right){
            m_startX=(m_startX+m_step+m_image.width())>m_width?m_startX:m_startX+m_step;
        }else if(event->key()==Qt::Key_Up){
            m_startY=(m_startY-m_step)<0?m_startY:m_startY-m_step;
        }else if(event->key()==Qt::Key_Down){
            m_startY=(m_startY+m_step+m_image.height())>m_height?m_startY:m_startY+m_step;
        }
    }
    drawPix();  //刷新图片的位置
    update();//触发窗口重绘 ,执行paintEvent();

}
  • 重写QWidget类绘制事件

绘制事件触发的条件:(查阅Qt帮助文档)

1、repaint() or update() was invoked,
2、the widget was obscured and has now been uncovered, or
3、many other reasons.

void keyEvent::paintEvent(QPaintEvent *event)
{
    //定义Qpainter对象,设置窗口为绘图设备,在窗口绘制pixmap
    QPainter painter;
    painter.begin(this);//绘图设备为窗口
    painter.drawPixmap(QPoint(0,0),*m_pix);
    painter.end();

}

三、效果

可在任意位置移动小车

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Qt实现图片移动实例(图文教程)

    这学期实训的时候用MFC做过一个飞机大战,很无聊的东西,一直想用Qt做一个,但是在学校的时候比较颓,回来看了一下. 首先需要解决的问题是图片的移动,怎么说飞机啊子弹啊都是动着的,图片当然要跑起来. 闲话休絮,首先用QtCreator新建一个QtGui程序,命名为PaintWidget,随便起的名字,实验么这不是. 会生成这三个文件,其中呢ui不用管,实验的图片移动需要用的是Event,不是信号槽,所以ui就不管了,放了那就是. 第一步要把图片画出来,参照<Qt学习之路的这段代码>,不难把图画出

  • VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片

    目录 摘要 关键代码解释 1️.Qt函数与Halcon算子获取的文件路径字符串的区别 摘要 本篇博文记录一下,用VS+Qt+Halcon实现对图片的读取以及鼠标缩放,移动(鼠标事件调用了halcon自带的算子)的过程.以及遇到的坑.....

  • Qt键盘事件实现图片在窗口上下左右移动

    本文实例为大家分享了Qt键盘事件实现图片在窗口上下左右移动,供大家参考,具体内容如下 标签(空格分隔): 键盘事件 一.项目内容: 新建桌面应用程序testKeyEvent,类名KeyEvent,基类QWidget,通过重写键盘事件到达操作的键盘的时候窗口中的图片上下左右移动,类似QtCreator设计模式下通过按键摆放部件时的效果. 二.实现细节 keyevent.h内容: #ifndef KEYEVENT_H #define KEYEVENT_H #include <QWidget> QT

  • Python鼠标事件及坐标获取窗口和屏幕坐标

    目录 效果如下: 分析: 重写关闭事件 重写上下文菜单事件 重写自带的绘制事件 也就是自定义 重新实现调整窗口大小事件 重新实现鼠标的释放事件 重新实现鼠标的移动事件 重新实现鼠标双击事件 重新实现键盘按下事件 源码如下 本文主要介绍重写自带的一些方法,拾取屏幕和窗口坐标信息 效果如下: 分析: 定时服务:在固定一段时间后执行相关的函数方法,例如这里表示的是在0秒后执行self.giveHelp这个方法 QTimer.singleShot(0, self.giveHelp) 重写关闭事件 def

  • QT实战之实现图片浏览系统

    目录 引言 实现功能 效果 实现图片浏览所用知识 实现流程 实现环境和UI设计 具体实现 引言 本系统支持,自动播放,左右拖动切换,点击列表切换,点击按钮切换:是一个标准的图像浏览软件. Windows 图片浏览器,可以查看当前文件夹下的图片,往上翻.往下翻并且自动播放: 此系统增加一个列表: 实现功能 1.浏览电脑里的文件夹,将当前文件夹下的图片列表罗列出来: 2.鼠标点击列表上的某一张图片,图片将显示出来: 3.可以控制浏览当前图片的上一张和下一张: 4.实现鼠标拖动图片,左划,右划切换图片

  • Python利用pyHook实现监听用户鼠标与键盘事件

    本文以一段简单的监听鼠标.键盘事件的程序,实现获取用户的输入(比如登录某些网站的账号.密码)的功能.经测试,对于一台"裸奔"的电脑,完全能获取到用户输入的任何信息:但是如果安装了杀毒软件,就够呛了.具体实现方法如下: 一.代码部分:获取用户输入信息,并与截图一起保存到XX目录下 # -*- coding: utf-8 -*- # import pythoncom import pyHook import time import socket from PIL import ImageG

  • Python中使用PyHook监听鼠标和键盘事件实例

    PyHook是一个基于Python的"钩子"库,主要用于监听当前电脑上鼠标和键盘的事件.这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所以PyHook也只能运行在Windows平台. 关于PyHook的使用,在它的官方主页上就有一个简单的教程,大体上来说,可以这样使用 # -*- coding: utf-8 -*- # 3import pythoncom 4import pyHook 5def onMouseEvent(e

  • selenium+python自动化测试之鼠标和键盘事件

    前面的例子中,点击事件都是通过click()方法实现鼠标的点击事件.其实在WebDriver中,提供了许多鼠标操作的方法,这些操作方法都封装在ActionChains类中,包括鼠标右击.双击.悬停和鼠标拖动等功能. ActionChains类提供的鼠标操作事件 context_click():点击鼠标右键 double_click():双击鼠标 drag_and_drop():拖动鼠标 move_to_element():鼠标悬停 鼠标悬停 页面上有些下拉菜单,在鼠标放到元素上以后,下面的菜单才

  • Python爬虫之Selenium实现键盘事件

    一.常用按键 按键 说明 Keys.BACK_SPACE 回退键(BackSpace) Keys.TAB 制表键(Tab) Keys.ENTER 回车键(Enter) Keys.SHIFT 大小写转换键(Shift) Keys.CONTROL Control键(Ctrl) Keys.ALT ALT键(Alt) Keys.ESCAPE 返回键(Esc) Keys.SPACE 空格键(Space) Keys.PAGE_UP 翻页键上(Page Up) Keys.PAGE_DOWN 翻页键下(Page

  • JavaScript 键盘事件的处理及属性详解

    目录 引言 处理键盘事件 键盘事件属性 引言 JavaScript 中的事件,当用户或浏览器尝试操作页面时,就会发生事件来处理 JavaScript 与HTML的交互.正如大家所知,JavaScript 与HTML一起工作,因此,页面加载.单击按钮.最小化窗口.单击鼠标.敲打键盘等发生的一切都是事件.就像在单击按钮时向用户显示任何消息一样,这是通过事件发生的. 所有HTML元素(如按钮.文本框.图像)都可以包含可以使用 JavaScript 代码触发的事件.所有这些事件都是DOM的一部分(文档对

  • jquery 键盘事件的使用方法详解

    jquery 键盘事件的使用方法详解 jQuery处理键盘事件有三个函数,根据事件发生的顺序分别是: jquery 代码: 1.  keydown(); 2.  keyup();  3.  keypress(); keydown() keydown事件会在键盘按下时触发,可以在绑定的函数中欧能够返回false来防止触发浏览器的默认事件. keyup() keyup事件会在按键释放时触发,也就是你按下键盘起来后的事件. keypress() keypress事件会在敲击按键时触发,我们可以理解为按

  • Vue键盘事件用法总结

    这两天学习了Vue.js 感觉组件这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记,学习一下Vue键盘事件 键盘事件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="../js/Vue.js" charset="utf-8"></sc

随机推荐