如何限制屏幕中的Qt窗口?

如何限制屏幕中的Qt窗口?,qt,Qt,在Widnows或Mac上,我可以将Qt窗口从一个屏幕拖到另一个屏幕。有没有一种优雅的方式将Qt窗口限制在一个屏幕上 更新: 我不想让窗口长距离跳回屏幕。所以对我来说,最好的解决办法就是在运动发生之前拦截它。但是我找不到一个方法来做 我对moveEvent做了一些更改,设置鼠标位置而不是设置小部件的位置。现在它不会闪烁得那么厉害了 auto screenNumber = QApplication::desktop()->screenNumber(this->currentHe

在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);
        }
    }
原职:

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

因为我拖动了标题栏,所以没有鼠标移动事件传递到窗口

代码


不要监听move事件,只需连接QWindow显示的信号即可。当屏幕改变时,将其恢复到原始显示器


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

如果用户可以进行拖动,那么从可用性的角度来看,阻止用户进行拖动可能不是一个好主意。我的意思是,用户可能可以选择随意禁用和启用屏幕,并使用它绕过您的预防措施。你为什么要强迫用户跳过这样的障碍,你有一个令人信服的理由吗?@hyde Yeah。对于UI设计问题,这只是一个快速而肮脏的解决方法。
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);
            }
        }
    }
}