事件函数的使用依托于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>
实现效果