среда, 23 августа 2017 г.

Прилипания окна к краям экрана

компьютер Appel
Как видите, их 3. Есть ещё 1, когда наше окно будет находится в нижней части экрана, но это не всегда надо, да и реализация простая.

Перейдем к 1 ситуации:
Как видно, нам нужно проверять X-координату окна, если она меньше или равна какой-то норме, то сдвигаем окно к краю экрана.
Для начала нам нужно ввести эту норму, константу. Я взял велечину в 5 пикселей.
iMaxDistance = 5 #px
# Величина, на которую будем сдвигать окно offsetX = 0 offsetY = 0
# Реализация первой ситуации: if self.x() <= iMaxDistance and self.x() >= 0: offsetX = -iMaxDistance

Вторая ситуация:
Здесь всё немного тяжелее. Нам нужно опять связать всю проверку на константе.
Если посмотреть ещё раз на схему, то видно, что если отнять размер всей рабочей области от X-координаты+размер окна, то мы получим расстояние от крайнего правого угла окна нашей программы до правой части экрана. Вот эту велечину мы и будем связывать с константой: if getDesktopRect().width() - (self.x() + self.width()) <= iMaxDistance and self.x() + self.width() == getDesktopRect().width(): offsetX = +iMaxDistance
Третий пример прост, как и первый: if self.y() <= iMaxDistance and self.y() >= 0: offsetY = -iMaxDistance
В итоге мы получаем сформированные offsetX, offsetY, которые указывают на смещения в координатах текущего положения окна. Поэтому мы просто перемещаем наше окно ещё раз, учитывая изменения: self.move(self.x() + offsetX, self.y() + offsetY)
Полностью код выглядит примерно так: def moveEvent(self, event): iMaxDistance = 5 #px offsetX = 0 offsetY = 0 if self.x() <= iMaxDistance and self.x() >= 0: offsetX = -iMaxDistance if getDesktopRect().width() - (self.x() + self.width()) <= iMaxDistance and self.x() + self.width() == getDesktopRect().width(): offsetX = +iMaxDistance if self.y() <= iMaxDistance and self.y() >= 0: offsetY = -iMaxDistance self.move(self.x() + offsetX, self.y() + offsetY)