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
- Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法
- 获取鼠标在图片中点击的坐标
- 在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法
- 在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法
- 在Qt中为QWidget创建鼠标点击处理
- QT中在QLabel显示图片并且利用鼠标点击画线
- CAD控件:在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法
- 响应鼠标点击的代码实现了在单独线程中下载图片并在ImageView显示
- 在WebBrowser控件中获取鼠标在网页上点击的位置
- OpenGL中与鼠标的交互——点击鼠标左键,在鼠标处画点
- VC中如何获取鼠标点击处控件的ID
- jquery实现在鼠标点击处的炫酷效果
- DX控件中鼠标双击(或鼠标右键同理)点击GridControl(GridView)的实现
- 在vc中如何实现对静态文本的鼠标点击事件的处理?
- MFC/VC中怎样实现slider滑块控件鼠标点击那里,就刚好落到点击位置
- QT中模拟鼠标点击事件
- ExtJs 完美实现图片在Window窗口中通过鼠标滚轮放大缩小以及点击拖拽
- Qt事件处理机制整个流程--以鼠标在一个窗口中点击为例
- 小米4 android6.01的开发者模式开启方法
- 【机器学习 吴恩达】CS229课程笔记notes1翻译-Part II分类和logistic回归
- 1.2算法基本举例(下篇)
- [Gym-101201K]
- 单元测试
- Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法
- 算法设计与分析笔记之(7):概率算法
- 数学趣事
- 最短排序数组(动态规划)
- 用C2制作小游戏
- Jzoj4604 树
- Construction sets 二分+背包
- The C Programming Language 练习题2-7
- 递归删除链表中的指定元素x