[英]Using mouse to move qwidget without exceeding parent size
我在父QWidget中添加了一個QWidget ,如下圖所示:
在子QWidget內部,我使用鼠標進行了編程,以將其移動到父QWidget中 。
void ExportComponent::mousePressEvent(QMouseEvent *event)
{
offset = event->pos();
}
void ExportComponent::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
this->move(mapToParent(event->pos() - offset));
}
}
它的性能不錯,但事實是它也可以移出Parent QWidget的大小 。 像這樣:
我如何才能使Child QWidge t僅在ParentQWidget中移動?
您可以在mouseMoveEvent
添加一個附加的if
子句,以檢查子窗口小部件是否仍在父窗口的邊界內。 下面的示例執行此操作:
void ExportComponent::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
QPoint newpos_min = mapToParent(event->pos()-offset);
QPoint newpos_max = QPoint(newpos_min.x() + this->width(), newpos_min.y() + this->height());
if(newpos_min.x() > 0 &&
newpos_min.y() > 0 &&
newpos_max.x() < this->parentWidget()->width() &&
newpos_max.y() < this->parentWidget()->height()){
this->move(mapToParent(event->pos() - offset));
}
}
}
但是,您現在遇到的問題是,如果新的x
或y
位置超出范圍,則無法再移動。 有幾種解決方法。
一種方法是動態更新mouseMoveEvent
的偏移量。 一個非常簡單的版本是如果運動不起作用,則更新偏移量:
... this->move(mapToParent(event->pos() - offset)); }else{ offset = event->pos(); } ...
仍然不太好,因為如果鼠標移回允許區域,這會在光標和小部件之間形成很大的間隙。
另一個可能性是將x和y運動分開並分別檢查dem:
if(newpos_min.y() > 0 && newpos_max.y() < this->parentWidget()->height()){ this->move(this->x(), mapToParent(event->pos() - offset).y()); } if(newpos_min.x() > 0 && newpos_max.x() < this->parentWidget()->width()){ this->move(mapToParent(event->pos() - offset).x(), this->y()); }
我認為這是一個更好的版本。
不過,更新偏移量可能會增加一些改進。 您只需要確保光標再次回到小部件上,然后再將其移動即可。
我將@Bowdzone的代碼與我的代碼結合在一起,以提供更好的解決方案。 這種新算法工作起來更加順暢,仍然可以滿足我的目的。
void ExportComponent::mouseMoveEvent(QMouseEvent *event)
{
//Using left mouse to move the control
if (event->buttons() & Qt::LeftButton)
{
//Excute movement follow mouse position
move(mapToParent(event->pos() - m_offset));
//Make sure control do not move out parent size
if (x() < 0)
move(1, y());
if (y() < 0)
move(x(), 1);
if (x() + width() > parentWidget()->width())
move(parentWidget()->width() - 1 - width(), y());
if (y() + height() > parentWidget()->height())
move(x(), parentWidget()->height() - 1 - height());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.