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

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()
{

}

资源图片:

运行:

时间: 2024-08-24 20:06:23

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

【Qt5开发及实例】24、数据柱形图显示

数据柱形图显示 1.我们首先把这个这个视图的表格部分表示出来 mainwindow.h /** * 书本:[Qt5开发及实例] * 功能:数据柱形图显示,这个类是表格显示 * 文件:mainwindow.h * 时间:2015年1月28日18:50:54 * 作者:cutter_point */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QStandardItemModel>

【Qt5开发及实例】8、各种对话框!!

1.标准文件对话框 就是点击这个按钮就会打开文件的对话框 具体的实现是: 头文件dialog.h: #include <QDialog> #include <QLineEdit> #include <QGridLayout> //网格布局 #include <QPushButton> #include <iostream> #include "inputdlg.h" #include "msgboxdlg.h&quo

【Qt5开发及实例】9、一个QQ界面

这个程序主要是为了学习一下工具盒类,这里使用了3个工具盒然后添加到整个界面上, 分别是:好友(good friend), 陌生人(do not remember), 黑名单(black items) 哈哈,原谅我这不咋地的英语,懂我就好. 实现图: 代码: drawer.h /** * 书本:[Qt5开发及实例] * 功能:实现一个自己的QQ界面 * 文件:drawer.cpp * 时间:2015年1月2日11:01:12 * 作者:cutter_point */ #ifndef DRAWER_

【Qt5开发及实例】25、实现代理的功能

实现代理的功能 在Qt里面也有MVC,那就是视图,模型,代理,后面我们再开一章,好好来学习一下Qt的MVC吧! main.cpp /** * 书本:[Qt5开发及实例] * 功能:实现代理的功能 * 文件:main.cpp * 时间:2015年1月29日20:53:04 * 作者:cutter_point */ #include <QApplication> #include <QStandardItemModel> #include <QTableView> //#i

【Qt5开发及实例】18、图形修饰小工具

图形修饰小工具 无力吐槽,这是我第三遍写这个了,到底是个什么意思???我只要一贴代码,浏览器直接崩溃,呵呵了,我也是,我现在只要写完一段字我就保存,尼玛在掉我就不写了,写到word里面,再贴上来. 效果 左边图形展示界面 paintarea.h /** * 书本:[Qt5开发及实例] * 功能:实现绘画各种图形 * 文件:paintarea.h * 时间:2015年1月21日16:59:25 * 作者:cutter_point */ #ifndef PAINTAREA_H #define PAI

Qt5主窗体程序: 文本编辑器的实现(Qt5开发及实例)

下面的程序出自<Qt5开发及实例>陆文周. 效果图: 程序是一个文本编辑器的实例,主界面如下: 程序中的源文件和头文件: 源代码: 文件main.cpp的源代码: #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); QFont font("楷体",15); a.setFont

【Qt5开发及实例】27、获得文件的信息

fileinfo.h /** * 书本:[Qt5开发及实例] * 功能:获得文件的信息 * 文件:fileinfo.h * 时间:2015年2月4日17:23:38 * 作者:cutter_point */ #ifndef FILEINFO_H #define FILEINFO_H #include <QDialog> #include <QLabel> #include <QPushButton> #include <QLineEdit> #include

【Qt5开发及实例】28、获取本机网络信息

networkinformation.h /** * 书本:[Qt5开发及实例] * 功能:获取本机网络信息 * 文件:networkinformation.h * 时间:2015年2月5日14:51:33 * 作者:cutter_point */ #ifndef NETWORKINFORMATION_H #define NETWORKINFORMATION_H #include <QWidget> #include <QLabel> #include <QLineEdit&

【Qt5开发及实例】29、实现服务器端的编程,UDP协议

udpserver.h /** * 书本:[Qt5开发及实例] * 功能:实现服务器端的编程 * 文件:udpserver.h * 时间:2015年2月5日21:05:21 * 作者:cutter_point */ #ifndef UDPSERVER_H #define UDPSERVER_H #include <QDialog> #include <QLabel> #include <QLineEdit> #include <QPushButton> #i