您的位置:首页 > 编程语言 > Qt开发

【Qt5开发及实例】32、实现键盘的监控操作

2015-03-14 21:41 423 查看

keyevent.h

/**
* 书本:【Qt5开发及实例】
* 功能:实现键盘控制
* 文件:keyevent.h
* 时间:2015年2月8日11:48:47
* 作者:cutter_point
*/
#ifndef KEYEVENT_H
#define KEYEVENT_H

#include <QWidget>
#include <QKeyEvent>    //键盘
#include <QPaintEvent>    //绘画事件
#include <QPainter>

class KeyEvent : public QWidget
{
  Q_OBJECT

public:
  KeyEvent(QWidget *parent = 0);
  ~KeyEvent();

  void drawPix();   //绘画图像
  void keyPressEvent(QKeyEvent *event);    //键盘相应
  void paintEvent(QPaintEvent *);

private:
  QPixmap *pix;   //缓冲图像
  QImage image;    //图片
  int startX;
  int startY;
  int width;
  int height;
  int step;   //每步的大小

};

#endif // KEYEVENT_H


keyevent.cpp

/**
* 书本:【Qt5开发及实例】
* 功能:实现键盘控制
* 文件:keyevent.cpp
* 时间:2015年2月8日11:48:47
* 作者:cutter_point
*/
#include "keyevent.h"

KeyEvent::KeyEvent(QWidget *parent)
  : QWidget(parent)
{
  setWindowTitle(tr("键盘事件"));

  this->setAutoFillBackground(true);
  QPalette palette = this->palette();   //取得调色板
  palette.setColor(QPalette::Window, Qt::white);    //设置背景默认颜色
  this->setPalette(palette);    //设置好调色板,使用调色板

  this->setMinimumSize(512, 256);
  this->setMaximumSize(512, 256);

  width = this->size().width();
  height = this->size().height();   //得到相应的长和高

  pix = new QPixmap(width, height);     //缓冲图形的大小
  pix->fill(Qt::white);

  image.load(":/image.png");   //加载图片

  startX = 100;
  startY = 100;

  step = 20;

  drawPix();    //绘图

  resize(512, 256);

}

//void drawPix();   //绘画图像
void KeyEvent::drawPix()
{
  pix->fill(Qt::white);
  QPainter *painter = new QPainter;   //绘画工具
  QPen pen(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);    //图片绘制
  painter->end();

}

//keyPressEvent(QKeyEvent *event);    //键盘相应
void KeyEvent::keyPressEvent(QKeyEvent *event)
{
  if(event->modifiers() == Qt::ControlModifier)   //是否有按下Ctrl
    {
      if(event->key() == Qt::Key_Left)    //左
        {
          startX = (startX - 1 < 0) ? startX : startX - 1;
        }
      if(event->key() == Qt::Key_Right)    //右
        {
          startX = (startX + image.width() > width) ? startX : startX + 1;
        }
      if(event->key() == Qt::Key_Up)    //上
        {
          startY = (startY - 1 < 0) ? startY : startY - 1;
        }
      if(event->key() == Qt::Key_Down)    //下
        {
          startY = (startY + image.height() > height) ? startY : startY + 1;
        }
    }
  else
    {
      startX = startX - startX % step;      //化为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 + image.height() + step > height) ? startY : startY + step;
        }
      if(event->key() == Qt::Key_Home)    //起点
        {
          startX = 0;
          startY = 0;
        }
      if(event->key() == Qt::Key_End)   //终点
        {
          startX = width - image.width();
          startY = height - image.height();
        }
    }

  drawPix();
  this->update();

}

//void paintEvent(QPaintEvent *);
void KeyEvent::paintEvent(QPaintEvent *)
{
  QPainter painter;
  painter.begin(this);
  painter.drawPixmap(QPoint(0, 0), *pix);   //把图像画到空间,显示
  painter.end();
}

KeyEvent::~KeyEvent()
{

}


资源图片:



运行:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐