覆盖Qt的mousePressEvent会中断moveEvent参数

时间:2019-09-24 12:57:39

标签: c++ qt mouseevent

我已经实现了一个绑定的子窗口类,捕获了moveEvent,以防止用户将子窗口拖出MDI区域。然后,我尝试覆盖mousePressEvent函数。这导致moveEvent陷入困境。例如。单击子窗口的标题栏将导致其位置跳开100多个像素。

我正在使用Qt 5.13.0,VS Community 2017(15.9.15)和Windows 10 Pro。

这是在MainWindow中发生的,我在QT Creator 4.10.0(社区)中添加了MDI区域。可以从https://drive.google.com/file/d/15MBy7ArT7o9NjtOvcKD5TefT-Icndmb4/view?usp=sharing

下载演示该问题的最小应用程序。

注释mousePressEvent函数使moveEvent再次起作用。

绑定的子窗口的头文件是

#pragma once

#include <QMdiSubWindow>

class boundSubWindow : public QMdiSubWindow
{
protected:
    void mousePressEvent(QMouseEvent *event) override;

protected slots:
    virtual void moveEvent(QMoveEvent* moveEvent);
};

身体是

#include <QMoveEvent>

#include "boundsubwindow.h"

bool isSubInMdi(QRect& sub, QRect& mdi)
{
    return (sub.left() >= mdi.left() && sub.right() <= mdi.right() &&
            sub.top()  >= mdi.top() && sub.bottom() <= mdi.bottom());
}

void boundSubWindow::moveEvent(QMoveEvent* moveEvent)
{
    QPoint subPos = moveEvent->pos(),
           oldPos = moveEvent->oldPos();
    QRect  subRect = QRect(subPos.rx(), subPos.ry(), this->width(), this->height()),
           mdiRect = this->parentWidget()->rect();

    if (!isSubInMdi(subRect, mdiRect))
    {
        QRect oldSubRect(oldPos.rx(), oldPos.ry(), this->width(), this->height());

        if (isSubInMdi(oldSubRect, mdiRect))
            this->move(moveEvent->oldPos());
    }
}

void boundSubWindow::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::RightButton)
    {
        auto me = (boundSubWindow*)this;
    }
}

1 个答案:

答案 0 :(得分:1)

鉴于QMdiSubWindow的性质,我想它自己的mousePressEvent实现会做很多重要的工作-因此您需要在自己的mousePressEvent实现中调用它...

void boundSubWindow::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::RightButton)
    {
        auto me = (boundSubWindow*)this;
    }
    QMdiSubWindow::mousePressEvent(event);
}