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

来源:互联网 发布:linux文件列表 编辑:程序博客网 时间:2024/06/01 09:30

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键按下

0 0
原创粉丝点击