Невозможно сохранить размер и положение моих окон на Pyqt5 - PullRequest
0 голосов
/ 24 июня 2019

Когда я в любом случае перемещаю и / или изменяю размеры своих окон на моем экране, я хотел бы сохранить эти параметры в следующий раз, когда я буду запускать свое приложение, но это невозможно.

Я открываю новую проблему, потому чтоЯ не вижу в разделе pyqt5, что я разместил здесь

Я нахожусь в Linux (Manjaro), использую PyCharm с последними PyQT5, Python и QT5 на ядре 5.1.18-1.

Я пробовал несколько вещей, подобных этой: https://github.com/baoboa/pyqt5/blob/master/examples/mainwindows/application/application.py#L197-L207

Я не использовал класс QDesktopWidget: кажется, что он устарел: Класс QDesktopWidget

Я в Linux (Manjaro) использую PyCharm с последними PyQT5, Python и QT5 в ядре 5.1.18-1.

#check if the hidden project folder is created by default, if not it is created
HOME_PATH = os.path.expanduser("~")
USER_PATH = os.path.join(HOME_PATH, ".mx5000")
if not os.path.exists(USER_PATH):
    os.mkdir(USER_PATH)
#configFolder = os.path.join(QDir.homePath(), ".mx5000")
#configFile = os.path.join(QDir.homePath(), ".mx5000/config.conf")
#configLog = os.path.join(QDir.homePath(), ".mx5000/logfile")

config_path = os.path.join(USER_PATH, "config.ini")
#settings = QSettings()
# config = configparser.ConfigParser()
# config['DEFAULT'] = {'path_keyboard': "/dev/hiddev0",
#                      'keyboard_name': "Whatever",
#                      'server_type':    "self.ui.rdbimap.setChecked(True)",
#                      'server_adress': "self.ui.lneserveradress.setText(imap.yourserver.com)",
#                      'username': 'username',
#                      'password': "cnffjbep",
#                      'time_to_check': '10',
#                      'keyboard_beep': '1',
#                      'play_sound': '1',
#                      'sound_directory': "/home/user/.mx5000/notify.ogg"}
#if not os.path.isfile("config"):
    #os.mkdir(USER_PATH)
# with open('config.ini', 'w') as configfile:
      config.write(configfile)


class Mx5000(QDialog):
    def __init__(self, parent=None):
        super(Mx5000, self).__init__(parent)

    self.setupUi()
    self.connectActions()
    self.dirty = False
    self.loadSettings()
    # self.default_size = QSize(615, 800)
    # self.default_position = QPoint(20, 20)
    # self.ui.lneserveradress.setText('imap.yourserver.com')
    # settings = QSettings()
    # pos = settings.value("pos", QPoint(200, 200))
    # size = settings.value("size", QSize(615, 800))
    # self.resize(size)
    # self.move(pos)

       #===============================================================================
...

def closeEvent(self, event):
    if self.okToContinue():
        # settings = QSettings()
        # pass
        self.writeSettings()
        event.accept()
    else:
        event.ignore()

#====================================================================================================================

def loadSettings(self):
    settings = QSettings('Exemple app', 'MX5000')
    pos = settings.value("pos", QPoint(200, 200))
    size = settings.value("size", QSize(615, 800))
    self.resize(size)
    self.move(pos)

def writeSettings(self):
    settings = QSettings('Exemple app', 'MX5000')
    settings.setValue("pos", self.pos())
    settings.setValue("size", self.size())
    #====================================================
    # settings.setValue("size", QSize(615, 800).tosize())
    # settings.setValue("pos", QPoint(200, 200).toPoint())
    #====================================================

    settings.sync()

#===================================================================================================================

def okToContinue(self):

    if self.dirty is True:
        reply = QMessageBox.question(self, self.tr("MX 5000", "Did you want to close the application ?"),
                                     QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
        if reply == QMessageBox.Cancel:
            return False
        elif reply == QMessageBox.Yes:
            self.Mx5000.close()
            self.application.quit()
            self.writeSettings()
            return True

Все файлы (Python и пользовательский интерфейс)доступно, если неясно некоторое время здесь: файл python

и

файл пользовательского интерфейса

Предварительно Спасибомного.

1 Ответ

1 голос
/ 24 июня 2019

Ваша логика немного странная, у каждого метода / функции должна быть определенная задача, в случае метода okToContinue (), я думаю, вам следует проверять, принимает ли пользователь закрытие окна или нет, если флаг был активированв противном случае считается, что я принимаю закрытие, нет необходимости добавлять больше кода.

Учитывая вышеизложенное, решение:

class Mx5000(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Mx5000, self).__init__(parent)
        self.setupUi()
        self.dirty = False
        self.loadSettings()

    def setupUi(self):
        self.ui = Ui_MX5000()
        self.ui.setupUi(self)
        # ...

    def closeEvent(self, event):
        if self.okToContinue():
            self.writeSettings()
            event.accept()
        else:
            event.ignore()

    def loadSettings(self):
        settings = QtCore.QSettings("Exemple app", "MX5000")
        pos = settings.value("pos", QtCore.QPoint(200, 200))
        size = settings.value("size", QtCore.QSize(615, 800))
        self.resize(size)
        self.move(pos)

    def writeSettings(self):
        settings = QtCore.QSettings("Exemple app", "MX5000")
        settings.setValue("pos", self.pos())
        settings.setValue("size", self.size())

    def okToContinue(self):
        if self.dirty:
            reply = QtWidgets.QMessageBox.question(
                self,
                self.tr("MX 5000", "Did you want to close the application ?"),
                QtWidgets.QMessageBox.Yes
                | QtWidgets.QMessageBox.No
                | QtWidgets.QMessageBox.Cancel,
            )
            return reply == QtWidgets.QMessageBox.Yes
        return True
...