網(wǎng)站首頁 編程語言 正文
本文實(shí)例為大家分享了Qt鍵盤事件實(shí)現(xiàn)圖片在窗口上下左右移動(dòng),供大家參考,具體內(nèi)容如下
標(biāo)簽(空格分隔): 鍵盤事件
一、項(xiàng)目內(nèi)容:
新建桌面應(yīng)用程序testKeyEvent,類名KeyEvent,基類QWidget,通過重寫鍵盤事件到達(dá)操作的鍵盤的時(shí)候窗口中的圖片上下左右移動(dòng),類似QtCreator設(shè)計(jì)模式下通過按鍵擺放部件時(shí)的效果。
二、實(shí)現(xiàn)細(xì)節(jié)
- keyevent.h內(nèi)容:
#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(); ? ? ? ? //自定義成員函數(shù)用來在pixmap上繪制網(wǎng)格線和圖片
protected:
? ? void keyPressEvent(QKeyEvent *event) override; ? ? ?//重寫鍵盤按下事件
? ? void paintEvent(QPaintEvent *event) override; ? ? ? //重寫繪圖事件
private:
? ? Ui::keyEvent *ui;
? ? QPixmap *m_pix;
? ? QImage m_image;
? ? int m_startX; ? //圖標(biāo)頂點(diǎn)的位置
? ? int m_startY;
? ? int m_width; ? ?//界面的寬度和高度
? ? int m_height;
? ? int m_step; ? ? //圖片移動(dòng)的步長
};
#endif // KEYEVENT_H
- 構(gòu)造函數(shù):(初始化窗口大小、pximap、加載圖片、要顯示圖片左上角的坐標(biāo))
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"); //當(dāng)前工作目錄默認(rèn)Debug目錄下,car.png在上一級目錄下
? ? m_startX=100;
? ? m_startY=100;
? ? m_step=20;
? ? drawPix();
}
- drawPix():定義Painter對象,并設(shè)置畫筆(虛線),m_pix作為繪圖設(shè)備,在上面繪制網(wǎng)格虛線,還有圖片的位置信息
void keyEvent::drawPix()
{
? ? m_pix->fill(Qt::white);
? ? QPainter painter(this);
? ? QPen pen(Qt::DotLine); //虛線
? ? painter.begin(m_pix); ? //m_pix為繪圖設(shè)備
? ? painter.setPen(pen);
? ? //按照步長畫縱向的網(wǎng)格虛線
? ? for(int i=m_step;i<m_width;i+=m_step){
? ? ? ? painter.drawLine(QPoint(i,0),QPoint(i,m_height));
? ? }
? ? //按照步長畫橫向的網(wǎng)格虛線
? ? 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+方向鍵一次圖片移動(dòng)一個(gè)像素的距離
2、普通方向鍵一次移動(dòng)步長(m_step:20像素)的距離,ui界面下默認(rèn)一次移動(dòng)10個(gè)像素
void keyEvent::keyPressEvent(QKeyEvent *event)
{
? ? //按下ctrl鍵移動(dòng)一個(gè)像素
? ? 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{
? ? ? ? //調(diào)整圖片左上角的位置到網(wǎng)格頂點(diǎn)
? ? ? ? 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();//觸發(fā)窗口重繪 ,執(zhí)行paintEvent();
}
- 重寫QWidget類繪制事件
繪制事件觸發(fā)的條件:(查閱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對象,設(shè)置窗口為繪圖設(shè)備,在窗口繪制pixmap
? ? QPainter painter;
? ? painter.begin(this);//繪圖設(shè)備為窗口
? ? painter.drawPixmap(QPoint(0,0),*m_pix);
? ? painter.end();
}
三、效果
可在任意位置移動(dòng)小車
原文鏈接:https://blog.csdn.net/qq_43686329/article/details/119958920
相關(guān)推薦
- 2022-07-18 CSS基礎(chǔ)語法和盒模型
- 2022-04-17 將本地jar放到pom中被maven管理
- 2022-07-16 Electron項(xiàng)目打包
- 2022-09-23 Go語言fmt.Sprintf格式化輸出的語法與實(shí)例_Golang
- 2022-04-25 C#關(guān)于Func和Action委托的介紹詳解_C#教程
- 2022-12-24 詳解Python裝飾器的四種定義形式_python
- 2022-08-06 Python結(jié)合spaCy?進(jìn)行簡易自然語言處理_python
- 2022-09-22 Windows無法啟動(dòng)MongoDB Server服務(wù)(錯(cuò)誤1053)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支