Переопределение Qt mousePressEvent ломает параметр moveEvent - PullRequest
0 голосов
/ 24 сентября 2019

Я реализовал связанный класс подокна, перехватывая moveEvent, чтобы пользователь не мог перетаскивать подокно из области MDI.Затем я попытался переопределить функцию mousePressEvent.Это заставляет moveEvent's потерять сознание.Например, нажатие на строку заголовка подокна приведет к тому, что его позиция отойдет на 100+ пикселей.

Я использую Qt 5.13.0, VS Community 2017 (15.9.15) и Windows 10 Pro.

Это происходит с MainWindow, в которое я добавил MDI Area в QT Creator 4.10.0 (Community).Минимальное приложение, демонстрирующее проблему, может быть загружено с 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 Ответ

1 голос
/ 24 сентября 2019

Учитывая природу QMdiSubWindow, я предполагаю, что его собственная реализация mousePressEvent выполняет немало важной работы - поэтому вам нужно вызывать ее из собственной реализации mousePressEvent ...

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