如何限制屏幕中的Qt窗口



在Widnows或Mac上,我可以将Qt窗口从一个屏幕拖动到另一个屏幕。有没有一种优雅的方法可以将Qt窗口限制在一个屏幕中?


更新:

我不想让窗户长距离跳回屏幕。因此,对我来说,完美的解决方案是在运动发生之前拦截它。但我找不到办法。

我对moveEvent((做了一些更改,设置了鼠标位置,而不是设置小部件的位置。现在它的闪烁没有那么严重。

auto screenNumber = QApplication::desktop()->screenNumber(this->currentHead());
if (screenNumber >= 0)
{
QScreen * screen = QApplication::screens().at(screenNumber);
auto screenRect = screen->geometry();
auto mousePosition = QCursor::pos();
if (!screenRect.contains(mousePosition))
{
mousePosition.setX(std::max(screenRect.left(),
std::min(mousePosition.x(), screenRect.right())));
mousePosition.setY(std::max(screenRect.top(),
std::min(mousePosition.y(), screenRect.bottom())));
QCursor::setPos(mousePosition);
}
}

原始帖子:

  1. 我曾尝试实现自己的moveEvent((,但结果非常糟糕。窗户闪得很厉害。我认为在moveEvent((中调用resize((不是一个好的做法。

  2. 由于我拖动了标题栏,所以没有鼠标移动事件传递到窗口。

代码

void Cmr42DockWidget::moveEvent(QMoveEvent * event)
{
if (isVisible() && isFloating())
{
auto screenNumber = QApplication::desktop()->screenNumber(this->currentHead());
if (screenNumber >= 0)
{
QScreen * screen = QApplication::screens().at(screenNumber);
auto rect = geometry();
auto screenRect = screen->geometry();
if (!screenRect.contains(rect))
{
if (rect.left() < screenRect.left())
{
rect.moveLeft(screenRect.left() - 1);
}
if (rect.right() > screenRect.right())
{
rect.moveRight(screenRect.right() - 1);
}
if (rect.top() < screenRect.top())
{
rect.moveTop(screenRect.top() + 1);
}
if (rect.bottom() > screenRect.bottom())
{
rect.moveBottom(screenRect.bottom() + 1);
}
setGeometry(rect);
}
}
}
}

不用监听move事件,只需连接QWindow暴露的screenChanged信号即可。当屏幕发生变化时,将其捕捉回原始显示器。

请注意,"屏幕"可能会因各种原因而更改。最常见的是用户将笔记本电脑从投影仪或外部显示器上卸下。因此,请确保始终将窗口移回可用屏幕。

最新更新