Python PyQt5 Изменение положения окна по горячим клавишам
У меня 2 вопроса по библиотеке PyQt5 .
- Хочу создать свойство при инициализации объекта класса Dialog(QWidget) , с возможностью изменять положение окна по горячим клавишам (стрелки клавиатуры) .
- Как мне сохранить последнее положение и размер окна , что бы при перезапуске приложения вызываемое окно открывалось в последней точке нахождения на рабочем столе .
Вот мой пример кода:
from PyQt5.QtWidgets import QWidget
class Dialog(QWidget):
def __init__(self):
super().__init__()
self.posX = None # позиция x
self.posY = None # позиция y
self.posW = None # позиция w
self.posH = None # позиция h
self.old_pos = None # Прошлая позиция
self.setWindowTitle('Dialog') # имя
self.setGeometry(300, 300, 300, 220) # Геометрия
self.setWindowOpacity(0.5) # Прозрачность
self.setWindowFlags(QtCore.Qt.CustomizeWindowHint) # окно без кнопок , можно менять размер
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
Надо переопределить метод
keyPressEventКак вариант(самый простой для вас способ) - сохранять то что вам надо, а надо вам всего ничего, в файл, например
geometry.ini. Обратите внимание, чтобы сохранять нужные значени, вам нужно переопределить методcloseEvent.
import os
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QVBoxLayout
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
class Dialog(QWidget):
def __init__(self):
super().__init__()
self.x = 300 # позиция по оси x
self.y = 300 # позиция по оси y
self.w = 300 # ширина
self.h = 220 # высота
# 'geometry.ini' - файл для сохранения последнее положение и размер окна
self.fileName = 'geometry.ini'
if os.path.exists(self.fileName):
with open(self.fileName, 'r') as f:
self._geometry = map(int, f.read().strip().split())
else:
self._geometry = [self.x, self.y, self.w, self.h]
self.setWindowTitle('Dialog') # имя Title
self.setGeometry(* self._geometry) # Геометрия
self.setWindowOpacity(0.5) # Прозрачность
self.setWindowFlags(Qt.CustomizeWindowHint) # окно без кнопок , можно менять размер
self.key_label = QLabel(alignment=Qt.AlignCenter)
layout = QVBoxLayout(self)
layout.addWidget(self.key_label)
def keyPressEvent(self, event):
x = self.pos().x()
y = self.pos().y()
if event.key() == Qt.Key_Up:
self.key_label.setText('Key Up Pressed')
self.move(x, y-10)
elif event.key() == Qt.Key_Down:
self.key_label.setText('Key Down Pressed')
self.move(x, y+10)
elif event.key() == Qt.Key_Left:
self.key_label.setText('Key Left Pressed')
self.move(x-10, y)
elif event.key() == Qt.Key_Right:
self.key_label.setText('Key Right Pressed')
self.move(x+10, y)
elif event.key() == Qt.Key_Escape:
self.close()
def closeEvent(self, event):
geometry = f"{self.geometry().x()} {self.geometry().y()} {self.geometry().width()} {self.geometry().height()}"
with open(self.fileName, 'w') as f:
f.write(geometry)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
app.setFont(QFont("Times", 12, QFont.Bold))
w = Dialog()
w.show()
sys.exit(app.exec_())
Автор решения: eswc poker
→ Ссылка
С событиями решил сам так :
def keyPressEvent(self, e):
if e.key() == Qt.Key_Escape:
self.close()
if e.key() == Qt.Key_Up:
self.resize(self.size().width(), self.height() + 1)
if e.key() == Qt.Key_Down:
self.resize(self.size().width(), self.height() - 1)
if e.key() == Qt.Key_Left:
self.resize(self.size().width() - 1, self.height())
if e.key() == Qt.Key_Right:
self.resize(self.size().width() + 1, self.height())
if e.key() == Qt.Key_8:
self.move(self.pos().x(), self.pos().y() - 1)
if e.key() == Qt.Key_2:
self.move(self.pos().x(), self.pos().y() + 1)
if e.key() == Qt.Key_4:
self.move(self.pos().x() - 1, self.pos().y())
if e.key() == Qt.Key_6:
self.move(self.pos().x() + 1, self.pos().y())
C настройками буду пробовать , спасибо за ответ...
