Python PyQt5 Изменение положения окна по горячим клавишам

У меня 2 вопроса по библиотеке PyQt5 .

  1. Хочу создать свойство при инициализации объекта класса Dialog(QWidget) , с возможностью изменять положение окна по горячим клавишам (стрелки клавиатуры) .
  2. Как мне сохранить последнее положение и размер окна , что бы при перезапуске приложения вызываемое окно открывалось в последней точке нахождения на рабочем столе .

Вот мой пример кода:

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
  1. Надо переопределить метод keyPressEvent

  2. Как вариант(самый простой для вас способ) - сохранять то что вам надо, а надо вам всего ничего, в файл, например 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 настройками буду пробовать , спасибо за ответ...

→ Ссылка