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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章