Как всегда держать 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);

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


person aviit    schedule 10.12.2015    source источник
comment
Возможно, вы столкнулись с бесконечным циклом, так как setGeometry вызовет другой вызов moveEvent. Однако я только что протестировал этот код, и он отлично сработал для меня!   -  person ajshort    schedule 10.12.2015
comment
спасибо, я пробовал с move   -  person aviit    schedule 10.12.2015


Ответы (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().

person Aaron    schedule 10.12.2015
comment
Сделал важную правку. Теперь это действительно работает .. окно плавно возвращается в поле зрения, если оно перемещается за левую границу экрана. - person Aaron; 10.12.2015
comment
Подумайте об использовании этого механизма, чтобы удерживать окно по центру... может быть хороший эффект... или раздражающий; ) - person Aaron; 10.12.2015