Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法
2017-10-07 22:00
537 查看
首先应该知道,QLabel类是没有点击事件的。我们需要点击鼠标,那么必须重写一个QLabel类去继承原来的QLabel。比如说我定义PutPicLabel来继承QLabel。
在头文件中应该这么写:
一共重写了两个函数,一个是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函数的效果。
最终的效果如下,最右边竖着的是两张图,每次点击这两张图的一张,在整个界面上面随意点击,都能加载出来你刚才点击的那一张。
在头文件中应该这么写:
#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函数的效果。
最终的效果如下,最右边竖着的是两张图,每次点击这两张图的一张,在整个界面上面随意点击,都能加载出来你刚才点击的那一张。
相关文章推荐
- js鼠标点击图片实现随机变换图片的方法
- js鼠标点击图片实现随机变换图片的方法
- Android编程实现GridView控件点击图片变暗效果的方法
- MFC 图片控件图片加载以及鼠标移动事件和鼠标点击事件
- MFC 获取picture控件的鼠标点击坐标位置的方法
- 鼠标在slide控件的任意位置上点击,滑块滑动到该位置是如何实现的,有什么属性吗?
- 鼠标右键弹出菜单 上传图片自定义控件 弹出菜单(PopUp 控件) 2 实现数据库插入操作 文件名通过参数传递
- 网络图片延迟加载实现代码 超越jquery控件
- Dreamweaver 简单实现鼠标经过图片变换的方法
- js实现点击验证码无刷新重新加载验证码图片
- Flex Image控件显示BMP图片实现方法
- asp.net用鼠标滚轮实现图片缩放实现方法
- 用jQuery实现图片预加载和等比例缩小,大图可以点击关闭
- Image实现鼠标的拖动(自己做的图片显示控件)
- MFC 获取picture控件的鼠标点击坐标位置的方法
- 用jQuery实现图片预加载和等比例缩小,大图可以点击关闭
- Qt5_实现加载指定路径的图片
- Dev系列控件之XtraChart高级应用(模拟flash鼠标移动,点击实现相关信息提示)
- Qt 按钮如何实现背景图片的加载
- JavaScript实现在FF下图片移向鼠标点击处!