您的位置:首页 > 编程语言 > Qt开发

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

2017-10-07 22:00 537 查看
首先应该知道,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函数的效果。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: