Правильнее отдать эту работу оконному менеджеру. Но если очень хочется, можно вот так попробовать:
mainwindow.hCODE
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui
{
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void moveEvent(QMoveEvent *event);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cppCODE
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopWidget>
#include <QDebug>
#include <QtMath>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::moveEvent(QMoveEvent *event)
{
Q_UNUSED(event);
int windowTopBorder = pos().y();
int windowBottomBorder = windowTopBorder + size().height();
int windowLeftBorder = pos().x();
int windowRightBorder = windowLeftBorder + size().width();
qDebug() << windowLeftBorder << windowRightBorder << windowTopBorder << windowBottomBorder;
int screenTopBorder = 0;
int screenBottomBorder = QApplication::desktop()->height();
int screenLeftBorder = 0;
int screenRightBorder = QApplication::desktop()->width();
qDebug() << screenLeftBorder << screenRightBorder << screenTopBorder << screenBottomBorder;
const int magnetDistance = 150;
if (abs(windowLeftBorder - screenLeftBorder) < magnetDistance)
{
move(0, pos().y());
}
if (abs(windowRightBorder - screenRightBorder) < magnetDistance)
{
move(screenRightBorder - size().width(), pos().y());
}
if (abs(windowTopBorder - screenTopBorder) < magnetDistance)
{
move(pos().x(), 0);
}
if (abs(windowBottomBorder - screenBottomBorder) < magnetDistance)
{
move(pos().x(), screenBottomBorder - size().height());
}
}