首先應該知道,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函數的效果。
最終的效果如下,最右邊豎着的是兩張圖,每次點選這兩張圖的一張,在整個界面上面随意點選,都能加載出來你剛才點選的那一張。
