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>

实现效果

 

猜你喜欢

转载自blog.csdn.net/m0_68672255/article/details/130593154