在一个QWidget中拖拽一个控件并限制其在控件中移动不能超出范围,使用相对坐标进行处理,并且在限制时只能计算鼠标的坐标,不能依赖于控件的坐标做判断条件。具体代码,继承QWidget,重写鼠标事件
void mousePressEvent(QMouseEvent *event)override;
void mouseMoveEvent( QMouseEvent * event )override;
void mouseReleaseEvent(QMouseEvent *event)override;
具体的思路代码如下:
**mousePressEvent**函数内记录下鼠标初始坐标,和控件的左上角的坐标,并计算鼠标在窗口的区域限制。left 、top、right、bottom;代码中的shape是一个QWidget自定义控件。变量x_left_distance;x_right_distance;y_top_distance;y_bottom_distance为int类型;m_start_move_Point、m_shape_Point 为QPoint类型。
void CRealplayWidget::mousePressEvent(QMouseEvent *event)
{
m_start_move_Point = event->pos();
m_shape_Point = shape->frameGeometry().topLeft();
x_left_distance= (event->pos().x()-this->frameGeometry().topLeft().x()) - (shape->frameGeometry().topLeft().x()-this->frameGeometry().topLeft().x());
x_right_distance=event->pos().x()+(this->frameGeometry().topRight().x() - shape->frameGeometry().topRight().x() );
y_top_distance=(event->pos().y()-this->frameGeometry().topLeft().y()) - (shape->frameGeometry().topLeft().y()-this->frameGeometry().topLeft().y());
y_bottom_distance=event->pos().y()+(this->frameGeometry().bottomRight().y() - shape->frameGeometry().bottomRight().y() );
}
mouseMoveEvent 函数中计算移动的范围
void CRealplayWidget::mouseMoveEvent ( QMouseEvent * event )
{
if(event->pos().x()>=x_left_distance &&
event->pos().x()<= x_right_distance &&
event->pos().y()>= y_top_distance&&
event->pos().y()<= y_bottom_distance)
{
/*移动中的鼠标位置相对于初始位置的相对位置.*/
QPoint relativePos = event->pos() - m_start_move_Point;
shape->move(m_shape_Point + relativePos );
}
}
**mouseReleaseEvent**函数只做一些释放后的逻辑处理即可。具体的思路在press、move中即可实现。
矩形框颜色设置为红色的效果的方式:
将自定义的QWidget进行以下设置:
构造函数中
this->setAutoFillBackground(true);
this->setStyleSheet("border: 2px solid rgb(255,0,0);");
重写paintEvent
#include <QBitmap>
#include <QStyleOption>
void AlargeShape::paintEvent(QPaintEvent *e)
{
QStyleOption opt;
opt.init(this);
QBitmap bitMap(width(),height());
QPainter painter(&bitMap); painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
painter.drawRect(0, 0, size().width(),size().height());
style()->drawPrimitive(QStyle::PE_Frame, &opt, &painter, this);
setMask(bitMap);
}