重写 Qt 的 mousePressEvent 会破坏 moveEvent 参数
Overriding Qt's mousePressEvent breaks moveEvent parameter
我实现了绑定 sub-window class,捕获 moveEvent 以防止用户将 sub-window 拖出 MDI 区域。然后我试图覆盖 mousePressEvent 函数。这会导致 moveEvent 失控。例如。单击 sub-window 的标题栏会导致其位置跳转 100+ 像素。
我正在使用 Qt 5.13.0、VS Community 2017 (15.9.15) 和 Windows 10 Pro。
我在 QT Creator 4.10.0(社区)中添加了 MDI 区域的主窗口会发生这种情况。可以从 https://drive.google.com/file/d/15MBy7ArT7o9NjtOvcKD5TefT-Icndmb4/view?usp=sharing
下载演示该问题的最小应用程序
注释掉 mousePressEvent 函数会使 moveEvent 再次运行。
绑定sub-window的header文件是
#pragma once
#include <QMdiSubWindow>
class boundSubWindow : public QMdiSubWindow
{
protected:
void mousePressEvent(QMouseEvent *event) override;
protected slots:
virtual void moveEvent(QMoveEvent* moveEvent);
};
body是
#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;
}
}
鉴于 QMdiSubWindow
的性质,我的猜测是它自己的 mousePressEvent
实现做了一些重要的工作——所以你需要从你自己的 mousePressEvent
中调用它] 实施...
void boundSubWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton)
{
auto me = (boundSubWindow*)this;
}
QMdiSubWindow::mousePressEvent(event);
}
我实现了绑定 sub-window class,捕获 moveEvent 以防止用户将 sub-window 拖出 MDI 区域。然后我试图覆盖 mousePressEvent 函数。这会导致 moveEvent 失控。例如。单击 sub-window 的标题栏会导致其位置跳转 100+ 像素。
我正在使用 Qt 5.13.0、VS Community 2017 (15.9.15) 和 Windows 10 Pro。
我在 QT Creator 4.10.0(社区)中添加了 MDI 区域的主窗口会发生这种情况。可以从 https://drive.google.com/file/d/15MBy7ArT7o9NjtOvcKD5TefT-Icndmb4/view?usp=sharing
下载演示该问题的最小应用程序注释掉 mousePressEvent 函数会使 moveEvent 再次运行。
绑定sub-window的header文件是
#pragma once
#include <QMdiSubWindow>
class boundSubWindow : public QMdiSubWindow
{
protected:
void mousePressEvent(QMouseEvent *event) override;
protected slots:
virtual void moveEvent(QMoveEvent* moveEvent);
};
body是
#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;
}
}
鉴于 QMdiSubWindow
的性质,我的猜测是它自己的 mousePressEvent
实现做了一些重要的工作——所以你需要从你自己的 mousePressEvent
中调用它] 实施...
void boundSubWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton)
{
auto me = (boundSubWindow*)this;
}
QMdiSubWindow::mousePressEvent(event);
}