Как сохранить мой 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()
,