Как сохранить мой QMainWindow всегда внутри рабочего стола?

Я хочу сохранить свой 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);

Работало без сбоев, но я не доволен, потому что движение не плавное.

1 ответ

Это должно плавно помочь с верхним левым углом... но вам нужно будет добавить еще несколько условий, чтобы заставить его работать для всех четырех сторон.

posX а также posY являются переменными-членами.

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()));
   }
}

Чтобы сделать это еще более элегантным, подумайте об использовании QVariantAnimation с QRect а также setGeometry(),

Другие вопросы по тегам