【发布时间】:2019-01-16 14:49:02
【问题描述】:
我正在构建一个 Qt5 应用程序,该应用程序允许用户用鼠标在图像上绘制橡皮筋,以选择图像的某个区域进行进一步处理。
我的代码只允许用户开始绘制橡皮筋,方法是将 QLabel 子类化为自定义类 (frame_displayer),该类 mousePressEvent() 被覆盖,因此仅在鼠标操作按下发生在自定义分类小部件中。
问题是,当初始点击在 frame_displayer 内时,mouseMoveEvent(),我用来相应更改橡皮筋大小的函数,即使在拖动鼠标光标时也会继续调用在 frame_displayer 之外。
我尝试使用 leaveEvent() 和 enterEvent() 来控制一个类布尔标志,mouseMoveEvent 中的代码可以依靠该标志来了解光标是否仍在小部件。但是,leaveEvent() 和 enterEvent() 都只在没有按住鼠标按钮时被调用,因此它们无法用于约束橡皮筋。
另外,underMouse() 总是返回 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";
}
提前致谢!
【问题讨论】:
标签: c++ qt5 qmouseevent rubber-band