天天看点

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 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法

继续阅读