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

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

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

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

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

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

// 绘制事件

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 
#include
#include//图片类
#include//画家类
#include//键盘事件参数
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()<width()<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控制小飞机在上面移动。

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

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include 
#include
#include
#include
#include
#include

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()<labelImg->x()<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



 Dialog
 
  
   
    0
    0
    400
    300
   
  
  
   Dialog
  
  
   
    
     160
     120
     30
     30
    
   
   
    
   
   
    :/new/prefix1/plane.png
   
  
 
 
 
  
 
 

实现效果

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

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

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

你可能感兴趣的:(qt,c++,开发语言)