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