QT添加新类,支持屏幕取色

有时想给默认的控件增加功能,这就需要添加新类,新类继承原有的控件类。

任务需求:在QLabel中显示了一幅图片setPixmap,鼠标点击这幅图片时,获取鼠标指针在图片中的坐标和颜色

进阶需求:点击屏幕上任何一个点,获取鼠标指针在整个屏幕中的坐标、屏幕中点的颜色

基础知识:添加新类的步骤

0、添加新类QLabelEx,该类支持获取鼠标位置和颜色(因为Pixmap图片被设置在了QLabel中,获取鼠标在QLabel中的坐标,就相当于获取了鼠标在图片中的坐标),关于把图片显示在QLabel中,可参考另一篇文章:《QT半透明图片叠加显示》

1、右击项目 -> 添加新文件 -> c++ -> c++ class,输入新类名和继承的父类名

2、完成新类的声明和定义(见下面的示例代码),下面几个点容易遗忘,要注意:

(1)如果该类需要用到信号槽机制的话(或者说该类是QObject的子类),类的声明中就要添加Q_OBJECT,添加该宏后,要任意修改一下.pro文件,例如加个空格,这样可以让QT自动重新生成make文件,否则Q_OBJECT不会生效,而且编译还报错。

(2)如果新控件可能需要作为子控件,那么需要构造函数声明中添加形参默认值(QWidget *parent = 0),在构造函数的定义中初始化列表添加QLabel(parent)


任务需求的解决办法:

覆盖鼠标按下函数:mousePressEvent(QMouseEvent *ev),从该函数的形参可以获得关于鼠标的很多信息,例如鼠标的全局坐标、在控件中的坐标、点击的是左键还是右键···等信息,具体可查阅QMouseEvent 类的帮助。

获取了鼠标在控件内的坐标以后,在该坐标处进行截图,截图函数为grab,设置截图区域为一个像素点即可,截图函数返回一幅QPixmap图片,这样就能获取颜色了,然后发出信号即可。

QObject::connect ( ui->mylabel, SIGNAL(mouse_pressed(QPoint, QColor)),

                        this, SLOT(on_mylabel_pressed(QPoint, QColor)) );

把UI的控件提升为自己的类,就能使用了。

//qlabelex.h
#ifndef QLABELEX_H
#define QLABELEX_H
#include <QLabel>
#include <QPoint>
#include <QColor>
#include <QMouseEvent>

class QLabelEx : public QLabel
{
    Q_OBJECT//如果该类要使用信号槽机制,则必须添加该宏
public:
    explicit QLabelEx(QWidget *parent = 0);
    ~QLabelEx();
protected:
    void mousePressEvent(QMouseEvent *ev);//重写鼠标事件
signals:
    void mouse_pressed(QPoint mouseLocalPos, QColor pointColor);//自定义信号
};
#endif // QLABELEX_H
//qlabelex.c
#include "qlabelex.h"
#include <QPixmap>
#include <QRgb>
#include <qDebug>

QLabelEx::QLabelEx(QWidget *parent) :
    QLabel(parent)
{

}
QLabelEx::~QLabelEx()
{

}
void QLabelEx::mousePressEvent(QMouseEvent *e)
{   
    QPoint mouse_local_pos = e->pos();
    QPixmap pixmap = this->grab(QRect(mouse_local_pos, QSize(1,1)));//截图1个像素
    QRgb rgb = pixmap.toImage().pixel(0,0);
    //qDebug()<<"鼠标位置:"<<mouse_local_pos;
    //qDebug()<<"鼠标颜色:"<<QColor(rgb);
    emit mouse_pressed( mouse_local_pos, QColor(rgb) );//发信号
}

全局截图:

QScreen *screen = QGuiApplication::primaryScreen();
    QPixmap pixmap= screen->grabWindow(0);//0代表桌面
    pixmapsave("123.jpg","JPG");
原型:QPixmap QScreen::grabWindow(WId window, int x = 0, int y = 0, int width = -1, int height = -1)



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值