如何在屏幕上限制Qt窗口?

时间:2018-07-13 21:01:06

标签: 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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

无需监听move事件,只需挂接到QWindow公开的screenChanged信号即可。当屏幕改变时,将其捕捉回原始监视器。

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