【问题标题】:Overriding Qt's mousePressEvent breaks moveEvent parameter覆盖 Qt 的 mousePressEvent 会中断 moveEvent 参数
【发布时间】:2019-09-24 21:05:04
【问题描述】:

我已经实现了一个绑定子窗口类,捕获 moveEvent 以防止用户将子窗口拖出 MDI 区域。然后我试图覆盖 mousePressEvent 函数。这会导致 moveEvent 失控。例如。点击子窗口的标题栏会导致它的位置跳出 100+ 像素。

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

这发生在我在 QT Creator 4.10.0(社区)中添加了 MDI 区域的 MainWindow 中。可以从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;
    }
}

【问题讨论】:

  • auto me = (boundSubWindow*)this; 应该做什么?
  • 没什么。在原始程序中,代码继续对已删除的窗口进行处理。

标签: c++ qt mouseevent


【解决方案1】:

鉴于QMdiSubWindow 的性质,我的猜测是它自己的mousePressEvent 实现做了很多重要的工作——所以你需要在你自己的mousePressEvent 实现中调用它...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 2022-08-18
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2019-01-30
    • 2018-04-05
    相关资源
    最近更新 更多