QT学习:键盘事件
通過鍵盤控制圖標的移動例子具體代碼如下:
 (1)頭文件“keyevent.h”的具體內容如下:
(2)源文件“keyevent.cpp”的具體代碼如下:
#include "keyevent.h" #include <QPainter> KeyEvent::KeyEvent(QWidget *parent) : QWidget(parent) { setWindowTitle(tr("鍵盤事件")); setAutoFillBackground(true); QPalette palette = this->palette(); palette.setColor(QPalette::Window,Qt::white); setPalette(palette); setMinimumSize(512,256); setMaximumSize(512,256); width=size().width(); height=size().height(); pix = new QPixmap(width,height); pix->fill(Qt::white); image.load("../image/image.png"); startX=100; startY=100; step=20; drawPix(); resize(512,256); }(3)在項目工程所在目錄下新建一個文件夾并命名為image,
 在文件夾內保存一個名為“image.png”的圖片;在項目中按照以下步驟添加資源文件。
 ① 在項目名“KeyEvent”上單擊鼠標右鍵→“添加新文件…”菜單項,在如下圖所示的對話框中單擊
 “Qt”(模板)→“Qt Resource File”→“Choose…”按鈕。。
 
 ② 在彈出的對話框中選擇資源要存放的路徑,如下圖所示:
 
在“名稱”欄中填寫資源名稱 “keyevent”。 單擊“下一步”按鈕,單擊“完成”按鈕。此時,項目下自動添加了一個“keyevent.qrc”資源文件。如下圖所示:
 
 ③ 鼠標右擊資源文件,選擇“Add Prefix…”菜單項,在彈出的“Add Prefix”對話框的“Prefix:”欄中填寫“/new/prefix1”,單擊“OK”按鈕,此時項目目錄樹右區資源文件下新增了一個“/new/prefix1”子目錄 項,單擊該區下方“添加”按鈕上的 ,選擇“添加文件”,按照如下圖所示的步驟操作,在彈出的對話框中選擇“image/image.png”文件,單擊“打開”按鈕,將該圖片添加到項目中。
 
 (4)drawPix()函數實現了在QPixmap對象上繪制圖像,其具體代碼如下:
keyPressEvent()函數處理鍵盤的按下事件,具體代碼如下:
void KeyEvent::keyPressEvent(QKeyEvent *event) {if(event->modifiers()==Qt::ControlModifier) //判斷修飾鍵Ctrl是否按下。Qt:: KeyboardModifier定義了 一系列修飾鍵{if(event->key()==Qt::Key_Left) //根據按下的左方向鍵調節圖標的左上頂點的位置,步進值為1,即細 微移動{startX=(startX-1<0)?startX:startX-1;}if(event->key()==Qt::Key_Right) //根據按下的右方向鍵調節圖標的左上頂點的位置,步進值為1,即細 微移動{startX=(startX+1+image.width()>width)?startX:startX+1;}if(event->key()==Qt::Key_Up) //根據按下的上方向鍵調節圖標的左上頂點的位置,步進值為1,即細微 移動{startY=(startY-1<0)?startY:startY-1;}if(event->key()==Qt::Key_Down) //根據按下的下方向鍵調節圖標的左上頂點的位置,步進值為1,即 細微移動{startY=(startY+1+image.height()>height)?startY:startY+1;}}else //對Ctrl鍵沒有按下的處理{/* 首先調節圖標左上頂點的位置至網格的頂點上 */startX=startX-startX%step;startY=startY-startY%step;if(event->key()==Qt::Key_Left) //根據按下的左方向鍵調節圖標的左上頂點的位置,步進值為網格的大 小{startX=(startX-step<0)?startX:startX-step;}if(event->key()==Qt::Key_Right) //根據按下的右方向鍵調節圖標的左上頂點的位置,步進值為網格的 大小{startX=(startX+step+image.width()>width)?startX:startX+step;}if(event->key()==Qt::Key_Up) //根據按下的上方向鍵調節圖標的左上頂點的位置,步進值為網格的大 小{startY=(startY-step<0)?startY:startY-step;}if(event->key()==Qt::Key_Down) //根據按下的下方向鍵調節圖標的左上頂點的位置,步進值為網格的 大小{startY=(startY+step+image.height()>height)?startY:startY+step;}if(event->key()==Qt::Key_Home) //表示如果按下Home鍵,則恢復圖標位置為界面的左上頂點{startX=0;startY=0;}if(event->key()==Qt::Key_End) //表示如果按下End鍵,則將圖標位置設置為界面的右下頂點,這里注 意需要考慮圖標自身的大小{startX=width-image.width();startY=height-image.height();}}drawPix(); //根據調整后的圖標位置重新在pix中繪制圖像update(); //觸發界面重畫 }界面重畫函數paintEvent(),將pix繪制在界面上。其具體代碼如下:
void KeyEvent::paintEvent(QPaintEvent *) { QPainter painter; painter.begin(this); painter.drawPixmap(QPoint(0,0),*pix); painter.end(); }(5)運行結果如下圖所示:
 
總結
 
                            
                        