您好,登錄后才能下訂單哦!
今天小編給大家分享一下怎么用Qt鍵盤事件實現圖片在窗口上下左右移動的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
新建桌面應用程序testKeyEvent,類名KeyEvent,基類QWidget,通過重寫鍵盤事件到達操作的鍵盤的時候窗口中的圖片上下左右移動,類似QtCreator設計模式下通過按鍵擺放部件時的效果。
keyevent.h內容:
#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(); //自定義成員函數用來在pixmap上繪制網格線和圖片 protected: void keyPressEvent(QKeyEvent *event) override; //重寫鍵盤按下事件 void paintEvent(QPaintEvent *event) override; //重寫繪圖事件 private: Ui::keyEvent *ui; QPixmap *m_pix; QImage m_image; int m_startX; //圖標頂點的位置 int m_startY; int m_width; //界面的寬度和高度 int m_height; int m_step; //圖片移動的步長 }; #endif // KEYEVENT_H
構造函數:(初始化窗口大小、pximap、加載圖片、要顯示圖片左上角的坐標)
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"); //當前工作目錄默認Debug目錄下,car.png在上一級目錄下 m_startX=100; m_startY=100; m_step=20; drawPix(); }
drawPix():定義Painter對象,并設置畫筆(虛線),m_pix作為繪圖設備,在上面繪制網格虛線,還有圖片的位置信息
void keyEvent::drawPix() { m_pix->fill(Qt::white); QPainter painter(this); QPen pen(Qt::DotLine); //虛線 painter.begin(m_pix); //m_pix為繪圖設備 painter.setPen(pen); //按照步長畫縱向的網格虛線 for(int i=m_step;i<m_width;i+=m_step){ painter.drawLine(QPoint(i,0),QPoint(i,m_height)); } //按照步長畫橫向的網格虛線 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+方向鍵一次圖片移動一個像素的距離
2、普通方向鍵一次移動步長(m_step:20像素)的距離,ui界面下默認一次移動10個像素
void keyEvent::keyPressEvent(QKeyEvent *event) { //按下ctrl鍵移動一個像素 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{ //調整圖片左上角的位置到網格頂點 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();//觸發窗口重繪 ,執行paintEvent(); }
重寫QWidget類繪制事件
繪制事件觸發的條件:(查閱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對象,設置窗口為繪圖設備,在窗口繪制pixmap QPainter painter; painter.begin(this);//繪圖設備為窗口 painter.drawPixmap(QPoint(0,0),*m_pix); painter.end(); }
可在任意位置移動小車
以上就是“怎么用Qt鍵盤事件實現圖片在窗口上下左右移動”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。