簡體   English   中英

使用鼠標移動qwidget而不超過父級大小

[英]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));
        }
    }
}

但是,您現在遇到的問題是,如果新的xy位置超出范圍,則無法再移動。 有幾種解決方法。

  1. 一種方法是動態更新mouseMoveEvent的偏移量。 一個非常簡單的版本是如果運動不起作用,則更新偏移量:

     ... this->move(mapToParent(event->pos() - offset)); }else{ offset = event->pos(); } ... 

    仍然不太好,因為如果鼠標移回允許區域,這會在光標和小部件之間形成很大的間隙。

  2. 另一個可能性是將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM