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