Qt学习之一,键盘事件细节

7.20Qt学习蛋疼的第三天

在这里小小的抱怨一下,这几天学到了啥?哈?

在写之前加上一些小笔记。。。

怎样获取comboBox中的选定项值, 答:currentIndex()

今天老师“讲了”一个小模块,是键盘事件,自己感觉比较感兴趣的,于是决定把代码中的细节搞清楚些。

首先是头文件keyevent.h中的代码

#include<QWidget>
#include<QKeyEvent>//键盘事件库引入
#include<QPaintEvent>
class keyEvent : public QWidget{
  Q_OBJECT//至关重要,在网上查的:如果有Dialog或者MainWindows运行的话,Q_OBJECT是至关重要的
public:
  KeyEvent(QWidget *parent = 0);
  ~KeyEvent();
  void drawPix();
  void keyPressEvent(QKeyEvent *);
  void paintEvent(QPainEvent *);
private:
  QPixmap *pix;
  QImage image;
  int starX;
  int starY;
  int width;
  int height;
  int step;
};
其中

QPixmap *pix:作为一个绘图设备,使用双缓冲机制实现图形的绘制
QImage image:界面中间的小图标设定
int starX、int starY:图标的左上角顶点位置
int width、int height:界面的宽度和高度
int step:网格的大小,即移动的步进值

然后就是keyevent.cpp的内容

#include<QPainter>
#include"keyevent.h"
KeyEvent::KeyEvent(QWidget *parent):QWidget(parent)
{
    setWindowTitile(tr("键盘事件"));//设置窗口顶部的标题

    setAutoFillBackground(true);

    //palette是调色板的意思
    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);//此QPixmap对象用来准备随时接收绘制的内容
    pix->fill(Qt::white);//填充背景色为白色
    image.load("../image/image.png");//给image这个图片定义一个具体图片…&**%%¥¥…&@#!@#¥(=。=)
    starX = 100;
    stary = 100;

    step = 20;

    drawPix();

    resize(512,256);
}

还有一点就是图片的位置,在以上代码中,位置为../image/image.png在实际操作中,image.png图片的位置是当前cpp文件上级文件夹中的image文件夹中…好乱(=。=)

下面是drawPix()函数的实现
drawPix()函数实现了在QPixmap对象上绘制图像,其具体代码如下:

void KeyEvent::drawPix()
{
    pix->fill(Qt::white);
    QPainter *painter = new QPainter;
    QPen pen(Qt::DoLine);//QPen类定义了一个QPainter应该如何绘制线条和轮廓的形状。
    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(starX,starY),image);
    painter->end();
}
其中

pix->fill(Qt::white):重新刷新pix对象为白色底色
QPainter *painter = new QPainter:创建一个QPainter对象,并指定pix为绘图设备
QPen pen(Qt::DotLine):创建一个QPen对象,设置画笔的线型为Qt::DotLine,用于绘制网格
for(int i=step;i

void KeyEvent::keyPressEvent(QKeyEvent *event)
{
    if(event->modifiers()==Qt::ControlModifier)//判断修饰键【Ctrl】是否按下
    {
        if(event->key()==Qt::Key_Left)//根据按下的左方向键调节图标左上顶点的位置
        {
            startX=(starX-1<0)?startX:startX-1;
        }
        if(event->key()==Qt::Key_Right)//根据按下的右方向调节图标的左上顶点的位置,进步值为1
        {
            starX=(startX+1+image.width()>width)?startX:startX+1;
        }
        if(event->key()==Qt::Key_Up)
        {
            startY=(startY-1<0)?startY:stayY-1;
        }
        if(event->key()==Qt::Key_Down)
        {
            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+step+image.width()>width)?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();//根据调整后的图标位置重新再pix中绘制图像
    update();//触发界面重画
}

最后是painEvent()界面重画函数,将pix绘制在界面上

void KeyEvent::paintEvent(QPaintEvent *)
{
    QPainter painter;
    painter.begin(this);
    painter.drawPixmap(QPoint(0,0),*pix);
    painter.end;
}

其中
Qt::KeyboardModifier定义了一系列修饰键,如下所示:
Qt::NoModifier 没有修饰键按下
Qt::ShiftModifier 【Shift】键按下
Qt::ControlModifier 【Ctrl】键按下
Qt::AltModifier 【Alt】键按下
Qt::MetaModifier Meta键按下
Qt::KeypadModifier 小键盘按键按下
Qt::GroupSwitchModifier Mode switch键按下

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值