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