天天看點

Qt 中實作在控件中點選滑鼠,就在滑鼠點選處加載圖檔的方法

首先應該知道,QLabel類是沒有點選事件的。我們需要點選滑鼠,那麼必須重寫一個QLabel類去繼承原來的QLabel。比如說我定義PutPicLabel來繼承QLabel。

在頭檔案中應該這麼寫:

#ifndef PUTPICLABEL_H
#define PUTPICLABEL_H

#include <QLabel>
#include <QWidget>
#include <QPoint>
#include <QPixmap>
#include <QPaintEvent>
#include <vector>

using namespace std;

typedef struct PicPointInfo{//存圖檔的資訊
    QPoint picPoint;//圖檔的起始位置
    int picState;//需要加載哪種圖檔
}PicInfo;

class PutPicLabel:public QLabel{
    Q_OBJECT
public:
    ~PutPicLabel();
    PutPicLabel(QWidget* parent);
public:
    void mousePressEvent(QMouseEvent* event);
    virtual void paintEvent(QPaintEvent* event) override;
    QPixmap soldierImage;
    QPixmap tankImage;
    vector<PicInfo*> Pics;
};

#endif // PUTPICLABEL_H
           

一共重寫了兩個函數,一個是mousePressEvent,也就是滑鼠點選事件;另一個就是paintEvent,畫圖函數,用這個函數來進行加載圖檔。具體如下:

#include "putpiclabel.h"
#include "mainwindow.h"

#include <QMessageBox>
#include <QString>
#include <QMouseEvent>
#include <QDebug>
#include <QRect>
#include <QImage>
#include <QPainter>


PutPicLabel::~PutPicLabel(){

}

PutPicLabel::PutPicLabel(QWidget* parent):QLabel(parent){
    this->setMouseTracking(true);
    mouseState=0;//置初值為0,表明現在沒有圖檔被點選
    soldierImage.load(":/image1/soldier.jpg");
    tankImage.load(":/image1/tank.jpg");
}

void PutPicLabel::mousePressEvent(QMouseEvent *event){

    if(event->button()==Qt::LeftButton){//如果滑鼠左鍵被點選
        PicInfo *pic=new PicInfo;
        switch (mouseState) {
        case 1://士兵被點選
            pic->picPoint=event->pos();
            pic->picState=1;
            this->Pics.push_back(pic);
            update();
            break;
        case 2://坦克被點選
            pic->picPoint=event->pos();
            pic->picState=2;
            this->Pics.push_back(pic);
            update();
            break;
        default:
            break;
        }
    }
}
void PutPicLabel::paintEvent(QPaintEvent *event){
    QPainter painter(this);
    for(int i=0;i<Pics.size();i++){
        PicInfo *pPic=Pics[i];
        switch (pPic->picState) {
        case 1://是個士兵的圖檔
            painter.drawPixmap(pPic->picPoint.x(),pPic->picPoint.y(),60,60,soldierImage);
            break;
        case 2://是個坦克的圖檔
            painter.drawPixmap(pPic->picPoint.x(),pPic->picPoint.y(),60,60,tankImage);
            break;
        default:
            break;
        }
    }
}
           

主要思想是這樣的。首先有一個vector容器,這樣子可以把大量的圖檔都存進來統一進行顯示。其次對于mousePressEvent,每次點選左鍵,把這個滑鼠點選的位置,以及這個圖檔是士兵還是坦克這兩個資訊放在結構體裡面,壓進容器vector,這樣畫圖的時候,既能顯示多張不同圖檔,也能顯示出位置來。對于paintEvent,同樣從這個容器的頂開始畫,每張圖檔都畫出來,需要判斷是什麼圖檔,以及在哪裡畫。

這裡update函數需要知道,每次調用update函數,實際上都是調用paintEvent函數。

以及還需要知道怎麼把圖檔添加進資源中,實作load函數的效果。

最終的效果如下,最右邊豎着的是兩張圖,每次點選這兩張圖的一張,在整個界面上面随意點選,都能加載出來你剛才點選的那一張。

Qt 中實作在控件中點選滑鼠,就在滑鼠點選處加載圖檔的方法
Qt 中實作在控件中點選滑鼠,就在滑鼠點選處加載圖檔的方法

繼續閱讀