【问题标题】:How to remove cropped rect from QImage/QLabel?如何从 QImage/QLabel 中删除裁剪的矩形?
【发布时间】:2017-10-30 02:01:30
【问题描述】:

我做了子类化以包括鼠标点击功能。在这里,可以通过mousePressEventmouseMoveEventmouseReleaseEvent 选择一个矩形。当我尝试选择另一个矩形时,我之前的矩形并没有被删除。它仍然与我之前绘制的矩形一起显示,我不想显示。我只想选择并显示一个矩形。我的意思是当我再次按选择另一个矩形时,应该删除前一个。

我在这里包含了我的子类mouse_crop

mouse_crop.h如下

#ifndef MOUSE_CROP_H
#define MOUSE_CROP_H

#include <QMainWindow>
#include <QObject>
#include <QWidget>
#include <QMouseEvent>
#include <QLabel>
#include <QRubberBand>

class mouse_crop : public QLabel
{
    Q_OBJECT

public:

mouse_crop(QWidget *parent=0);
QRubberBand *rubberBand;
QPoint origin, ending;

protected:
    void mousePressEvent(QMouseEvent *ev);
    void mouseMoveEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);

signals:
    void sendMousePosition(QPoint&);
    void sendMouseEnding(QPoint&);
};

#endif // MOUSE_CROP_H`

mouse_crop.cpp如下

#include "mouse_crop.h"

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

}

void mouse_crop::mousePressEvent(QMouseEvent *ev)
{
    origin = ev->pos();
    rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
    if(ev->button()== Qt::LeftButton || ev->button()== Qt::RightButton)
    {
        rubberBand->show();
        emit sendMousePosition(origin);
    }
}

void mouse_crop::mouseMoveEvent(QMouseEvent *ev)
{
    rubberBand->setGeometry(QRect(origin, ev->pos()).normalized());
}

void mouse_crop::mouseReleaseEvent(QMouseEvent *ev)
{
    ending = ev->globalPos();
    if(ev->button()== Qt::LeftButton || ev->button()== Qt::RightButton)
    {
        emit sendMouseEnding(ending);
    }
}

谁能告诉我如何解决这个问题?提前致谢。

【问题讨论】:

    标签: c++ qt qlabel


    【解决方案1】:

    问题是因为每次按下鼠标都是在创建一个新的QRubberBand,你必须做的是只创建一个QRubberBand,隐藏它并在必要时显示它。

    mouse_crop::mouse_crop(QWidget *parent)
        : QLabel(parent)
    {
        rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
        rubberBand->hide();
    }
    
    void mouse_crop::mousePressEvent(QMouseEvent *ev)
    {
        origin = ev->pos();
        rubberBand->setGeometry(QRect(origin, origin));
    
        if(ev->button()== Qt::LeftButton || ev->button()== Qt::RightButton)
        {
            rubberBand->show();
            emit sendMousePosition(origin);
        }
    }
    
    void mouse_crop::mouseMoveEvent(QMouseEvent *ev)
    {
        rubberBand->setGeometry(QRect(origin, ev->pos()).normalized());
    }
    
    void mouse_crop::mouseReleaseEvent(QMouseEvent *ev)
    {
        ending = ev->globalPos();
        if(ev->button()== Qt::LeftButton || ev->button()== Qt::RightButton)
        {
            emit sendMouseEnding(ending);
        }
    }
    

    【讨论】:

    • 感谢您的回答。但只有当我再次尝试裁剪时它才会删除。但是如果我再按一下这个QLabel怎么办,前一个矩形会被清除。
    • @Sanakum 根据我在您的问题中的理解,您希望在创建另一个矩形时不显示前一个矩形。我是对的?
    • 是的,你完全正确,你的解决方案解决了我的问题。非常感谢您的帮助。但是我在评论中写的仍然存在一些问题。还有一件事是,当我再次按下时,我已经获得的矩形角点正在改变。它正在显示新的点坐标。
    • @Sanakum 如果我的回答是正确的,你为什么不把它标记为正确?我不明白,您能否更准确地描述您的问题?我已经试过了,它也像你说的那样有效。
    • @Sanakum 如有其他问题,欢迎创建new question
    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 2014-02-03
    • 2019-10-21
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多