我正在构建一个Qt5应用程序,该应用程序允许用户用鼠标在图像上绘制橡皮筋,以选择图像的特定区域进行进一步处理。
我的代码只允许用户开始绘制橡皮筋,方法是将QLabel子类化为自定义类(frame_displayer),mousePressEvent()将被覆盖,因此只有在自定义类小部件中发生鼠标按下时才会调用。
问题是,当初始单击在frame_displayer内部时,mouseMoveEvent(),我用来相应地更改橡皮筋大小的函数,即使鼠标光标被拖到frame_display外部,也会不断被调用。
我曾尝试使用leaveEvent()和enterEvent()[/strong>来控制一个类布尔标志,mouseMoveEvent内部的代码可以依赖该标志来知道光标是否仍在小部件中。但是,leaveEvent()和enterEvent()[/strong>都只在未按住鼠标按钮的情况下调用,因此无法约束橡皮筋。
此外,由于我未知的原因,Mouse()下的总是返回true。
frame_displayer.cpp的段
frame_displayer::frame_displayer(QWidget * parent) : QLabel(parent)
{
_rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
}
void frame_displayer::mousePressEvent(QMouseEvent *event)
{
_lastClickedBtn = event->button();
if (_lastClickedBtn == Qt::LeftButton)
{
_mouseOriginClickPoint = event->pos();
_rubberBand->setGeometry(QRect(_mouseOriginClickPoint, _mouseClickPoint));
_rubberBand->show();
}
}
void frame_displayer::mouseMoveEvent(QMouseEvent *event)
{
if(_rubberBand != nullptr)
{
if (this->underMouse())
{
if (_lastClickedBtn == Qt::LeftButton)
{
QPoint mouseCurrentPoint = event->pos();
_rubberBand->setGeometry(QRect(_mouseOriginClickPoint, mouseCurrentPoint).normalized());
}
}
}
}
void frame_displayer::mouseReleaseEvent(QMouseEvent *event)
{
_mouseOriginClickPoint = QPoint();
_lastClickedBtn = Qt::MidButton;
if(_rubberBand != nullptr)
{
_rubberBand->hide();
_rubberBand->clearMask();
}
}
void frame_displayer::leaveEvent(QEvent *event)
{
qDebug() << "Leaving";
}
void frame_displayer::enterEvent(QEvent *event)
{
qDebug() << "Entering";
}
提前感谢!
我认为这是预期的行为。如果你想限制橡皮筋的范围,那么只需将它们夹在mouseMoveEvent
覆盖中。。。
void frame_displayer::mouseMoveEvent(QMouseEvent *event)
{
if(_rubberBand != nullptr)
{
if (this->underMouse())
{
if (_lastClickedBtn == Qt::LeftButton)
{
QPoint mouseCurrentPoint = event->pos();
/*
* Clamp mouseCurrentPoint to the QRect of this widget.
*/
auto clamp_rect = rect();
mouseCurrentPoint.rx() = std::min(clamp_rect.right(), std::max(clamp_rect.left(), mouseCurrentPoint.x()));
mouseCurrentPoint.ry() = std::min(clamp_rect.bottom(), std::max(clamp_rect.top(), mouseCurrentPoint.y()));
_rubberBand->setGeometry(QRect(_mouseOriginClickPoint, mouseCurrentPoint).normalized());
}
}
}
}