在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()不是一个好习惯。
自从我拖动标题栏以来,没有鼠标移动事件传递到窗口。
代码
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);
}
}
}
}
答案 0 :(得分:1)
无需监听move事件,只需挂接到QWindow公开的screenChanged信号即可。当屏幕改变时,将其捕捉回原始监视器。
请注意-出于各种原因,“屏幕”可能会更改。最常见的是用户从投影仪或外部显示器上卸下了笔记本电脑。因此,请确保始终将窗口移回可用屏幕。