【问题标题】:How to keep my QMainWindow always inside of the desktop?如何让我的 QMainWindow 始终在桌面内?
【发布时间】:2016-03-15 14:53:03
【问题描述】:

我想将我的QMainWindow 始终保留在桌面内,所以我添加了QMainWindow::moveEvent 的实现:

void MainWindow::moveEvent(QMoveEvent *ev)
{
    if(ev->pos().x() < 0) setGeometry(0, ev->oldPos().y(), width(), height());
}

但是当我将窗口移到桌面左边界之外时,应用程序崩溃了。
这段代码有什么问题?为什么会崩溃?我的解决方案正确吗?

//--更新: 我试过这个:

int newx = ev->pos().x(),
        newy = ev->pos().y();
if(ev->pos().x() < 0) newx = 0;
if(ev->pos().y() < 0) newy = 0;
    move(newx, newy);

它没有崩溃但我不满意,因为移动不顺畅。

【问题讨论】:

  • 您可能会陷入无限循环,因为setGeometry 将触发对moveEvent 的另一个调用。但是我刚刚测试了这段代码,它对我来说很好用!
  • 谢谢,我试过move

标签: qt qmainwindow


【解决方案1】:

这应该对左上角有所帮助..但是您需要添加更多条件才能使其在所有四个方面都起作用。

posXposY 是成员变量。

void MainWindow::moveStep() { // [SLOT]
   int movX = 0, movY = 0;
   if(posX < 0) movX = 1;
   if(posY < 0) movY = 1;
   move(posX + movX, posY + movY);
}


void MainWindow::moveEvent(QMoveEvent *ev) {

   if(ev->pos().x() < 0 || ev->pos().y() < 0) {
      posX = ev->pos().x();
      posY = ev->pos().y();
      QTimer::singleShot(10, this, SLOT(moveStep()));
   }
}

为了更优雅地考虑使用QVariantAnimationQRectsetGeometry()

【讨论】:

  • 进行了重要的编辑。现在它真的有效了.. 如果移过左屏幕边框,窗口会平滑地移回视图。
  • 考虑使用这种机制来保持窗口居中 .. 可能会产生很好的效果 .. 或令人讨厌; )
猜你喜欢
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
相关资源
最近更新 更多