1.keyevent.h
#ifndef KEYEVENT_H
#define KEYEVENT_H
#include <QWidget>
#include <QKeyEvent>
#include <QPaintEvent>
class KeyEvent : public QWidget
{
Q_OBJECT
public:
explicit KeyEvent(QWidget *parent = 0);
~KeyEvent();
void drawPix();
void keyPressEvent(QKeyEvent *);
void paintEvent(QPaintEvent *);
private:
QPixmap *pix; //作為一個繪圖裝置,使用雙緩沖機制實作對圖形的繪制
QImage image; //界面中間的小圖示
int startX; //圖示的左上頂點位置
int startY;
int width; //界面的寬度和高度
int height;
int step; //網格的大小,即移動的步進值
signals:
public slots:
};
#endif // KEYEVENT_H
#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("C:/Qt/qt_salman/keyEvent/image/image.png");
startX=100;
startY=100;
step=20;
drawPix();
resize(512,256);
}
KeyEvent::~KeyEvent()
{
}
void KeyEvent::drawPix()
{
pix->fill(Qt::white); //重新重新整理pix對象為白色底色
QPainter *painter=new QPainter; //建立一個QPainter對象,并指定pix為繪圖裝置
QPen pen(Qt::DotLine); //建立一個QPen對象,設定畫筆的線型為Qt::DotLine,用于繪制網格
for(int i=step;i<width;i=i+step) //按照步進值的間隔繪制縱向的網格線
{
painter->begin(pix);
painter->setPen(pen);
painter->drawLine(QPoint(i,0),QPoint(i,height));
painter->end();
}
for(int j=step;j<height;j=j+step) //按照步進值的間隔繪制橫向的網格線
{
painter->begin(pix);
painter->setPen(pen);
painter->drawLine(QPoint(0,j),QPoint(width,j));
painter->end();
}
painter->begin(pix);
painter->drawImage(QPoint(startX,startY),image); //在pix對象中繪制可移動的小圖示
painter->end();
}
//處理鍵盤的按下事件
/*if(event->modifiers()==Qt::ControlModifier):判斷修飾鍵【ctrl】是否按下
* Qt::KeyboardModifier:定義了一系列修飾鍵
* Qt::NoModifier:沒有修飾鍵按下
* Qt::shiftModifier:【shift】鍵按下
* Qt::ControModifier:【Ctrl】鍵按下
* Qt::AltModifer:【Alt】鍵按下
* Qt::MetadModifer::Meta鍵按下
* Qt::KeypadModifiter:小鍵盤按鍵按下
* Qt::GroupSwitchModifer:Mode switch鍵按下
*/
//
void KeyEvent::keyPressEvent(QKeyEvent *event)
{
if(event->modifiers()==Qt::ControlModifier) //判斷修飾鍵【ctrl】是否按下
{
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(); //觸發界面重畫
}
void KeyEvent::paintEvent(QPaintEvent *)
{
QPainter painter;
painter.begin(this);
painter.drawPixmap(QPoint(0,0),*pix);
painter.end();
}
#include "keyevent.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
KeyEvent w;
w.show();
return a.exec();
}