事件函數(shù)的使用依托于Qt的事件機制,一個來自于外部事件的傳遞機制模型如下所示
信號槽雖然好用,但是無法包含所有的情況,事件函數(shù)可以起到對信號槽無法覆蓋的一些時機進行補充,事件函數(shù)的使用無需連接。
常用的事件函數(shù)如下所示。
//?繪制事件
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>//鍵盤事件參數(shù)
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
protected:
//聲明事件函數(shù) 虛函數(shù)
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;
}
//定義事件函數(shù)
void Dialog::paintEvent(QPaintEvent * event)
{
//輸出窗口寬高
qDebug()<<this->width()<<this->height();
//創(chuàng)建畫家類對象
QPainter painter(this);
QPixmap pic(":/new/prefix1/ikun.jpg");
//繪制圖片函數(shù)
//void drawPixmap(int x, int y, int width, int height, const QPixmap & pixmap)
//參數(shù):橫坐標 縱坐標 寬度 高度 圖片內容
//設置隨主窗口大小改變而變化
painter.drawPixmap(0,0,this->width(),this->height(),pic);
}
//所有的事件函數(shù)的參數(shù)都包含了當前類型事件的參數(shù)信息
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事件函數(shù)--實例:使用星空圖作為窗口背景,點擊鍵盤的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>
實現(xiàn)效果
文章來源:http://www.zghlxwxcb.cn/news/detail-500407.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-500407.html
到了這里,關于Qt使用星空圖作為窗口背景,點擊鍵盤的WASD控制小飛機在上面移動。的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!