Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法

来源:互联网 发布:比特精灵软件下载 编辑:程序博客网 时间:2024/06/05 13:28

首先应该知道,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_OBJECTpublic:    ~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函数的效果。

最终的效果如下,最右边竖着的是两张图,每次点击这两张图的一张,在整个界面上面随意点击,都能加载出来你刚才点击的那一张。



阅读全文
1 0