Qt鍵盤事件實(shí)現(xiàn)圖片在窗口上下左右移動(dòng)
本文實(shí)例為大家分享了Qt鍵盤事件實(shí)現(xiàn)圖片在窗口上下左右移動(dòng),供大家參考,具體內(nèi)容如下
標(biāo)簽(空格分隔): 鍵盤事件
一、項(xiàng)目?jī)?nèi)容:
新建桌面應(yīng)用程序testKeyEvent,類名KeyEvent,基類QWidget,通過(guò)重寫鍵盤事件到達(dá)操作的鍵盤的時(shí)候窗口中的圖片上下左右移動(dòng),類似QtCreator設(shè)計(jì)模式下通過(guò)按鍵擺放部件時(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ù)用來(lái)在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)的步長(zhǎ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在上一級(jí)目錄下 ? ? m_startX=100; ? ? m_startY=100; ? ? m_step=20; ? ? drawPix(); }
- drawPix():定義Painter對(duì)象,并設(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); ? ? //按照步長(zhǎng)畫縱向的網(wǎng)格虛線 ? ? for(int i=m_step;i<m_width;i+=m_step){ ? ? ? ? painter.drawLine(QPoint(i,0),QPoint(i,m_height)); ? ? } ? ? //按照步長(zhǎng)畫橫向的網(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)步長(zhǎ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對(duì)象,設(shè)置窗口為繪圖設(shè)備,在窗口繪制pixmap ? ? QPainter painter; ? ? painter.begin(this);//繪圖設(shè)備為窗口 ? ? painter.drawPixmap(QPoint(0,0),*m_pix); ? ? painter.end(); }
三、效果
可在任意位置移動(dòng)小車
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言進(jìn)階之字符串查找?guī)旌瘮?shù)詳解
字符串是一種非常重要的數(shù)據(jù)類型,但是C語(yǔ)言不存在顯式的字符串類型,C語(yǔ)言中的字符串都以字符串常量的形式出現(xiàn)或存儲(chǔ)在字符數(shù)組中,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階之字符串查找?guī)旌瘮?shù)的相關(guān)資料,需要的朋友可以參考下2023-01-01從頭學(xué)習(xí)C語(yǔ)言之if語(yǔ)句的使用
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言之if語(yǔ)句的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01C++11新特性之智能指針(shared_ptr/unique_ptr/weak_ptr)
這篇文章主要介紹了C++11新特性之智能指針,包括shared_ptr, unique_ptr和weak_ptr的基本使用,感興趣的小伙伴們可以參考一下2016-08-08C語(yǔ)言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出
上期我們講完了排序算法下,不知道小伙伴們有沒有發(fā)現(xiàn)一個(gè)問(wèn)題,快速排序和歸并排序我們都是用遞歸來(lái)實(shí)現(xiàn)的,可能有小伙伴會(huì)問(wèn),如果說(shuō)數(shù)據(jù)量很多話,棧區(qū)空間會(huì)不會(huì)不夠用呢?這期我們就來(lái)解決使用遞歸實(shí)現(xiàn)的排序?qū)е聴R绯鋈绾谓鉀Q2022-04-04C語(yǔ)言超詳細(xì)講解函數(shù)棧幀的創(chuàng)建和銷毀
我們知道c語(yǔ)言中函數(shù)都是被調(diào)用的,main函數(shù)里面能調(diào)用其他函數(shù),其實(shí)main函數(shù)也是被別的函數(shù)調(diào)用的,下面通過(guò)本文給大家分享c語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷毀過(guò)程,一起看看吧2022-05-05