无法在 Pyqt5 上保存我的窗口的大小和位置

Posted

技术标签:

【中文标题】无法在 Pyqt5 上保存我的窗口的大小和位置【英文标题】:Impossible to save the size and the position of my windows on Pyqt5 【发布时间】:2019-06-24 15:51:39 【问题描述】:

无论如何,当我在屏幕上移动或/和调整窗口大小时,我想保留此参数以备下次运行我的应用程序时使用,但这是不可能的。

我打开一个新问题,因为我在 pyqt5 部分没有看到我发布的 here

我在 Linux (Manjaro) 上使用 PyCharm,并在内核 5.1.18-1 上使用最新的 PyQT5、Python 和 QT5。

我已经尝试了几件这样的事情:https://github.com/baoboa/pyqt5/blob/master/examples/mainwindows/application/application.py#L197-L207

我没有使用 QDesktopWidget 类:它似乎被贬值了:QDesktopWidget class

我在 Linux (Manjaro) 上使用 PyCharm,并在内核 5.1.18-1 上使用最新的 PyQT5、Python 和 QT5。

#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 和 ui): python file

ui file

非常感谢。

【问题讨论】:

【参考方案1】:

你的逻辑有点奇怪,每个方法/函数都必须有一个特定的任务,在 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

【讨论】:

非常感谢 Eyllanesc 试图帮助我。是的,这是因为我已经尝试了这两种方法(在 Python 和 QT 中),这对我来说已经足够混乱,并且很长时间以来也阻止了我)。现在是我解决这个问题的时候了。您已经很好地理解了这种方法的目的。我修改了我的代码,得到了相同的结果。我在另一个代码较少的应用程序上做了同样的事情,我无法保留所做的更改。我没有 MB 显示。如果你想要这个其他应用程序的代码(它是如此的小且不那么混乱,告诉我)。另一件事我不明白为什么。 另一件事我不明白为什么。在填充此功能之前,我的应用程序位于我的屏幕中心,因为当我运行它时她在左侧。为什么 ?你对这种奇怪的行为有什么想法吗? @olielvewen 如果没有 MRE,就无法帮助您,如果您在 GH 中有一个 repo,您​​的项目我可以对实施进行 PR。 我有一个 GH 存储库,但不适用于那个项目。我将进行所有修改并告诉您是否可以找到它。我也会把其他 gui 变得更容易理解。让我这样做,我会给你更多。谢谢eyllanesc。 我已经进行了修改,您可以在文件夹 MX5000 中找到代码并建立 here。使用魔术命令git clone https://github.com/olielvewen/Mockups.git 但你知道,那是肯定的。

以上是关于无法在 Pyqt5 上保存我的窗口的大小和位置的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5:布局

我们如何获得窗口的边框大小?

我的ppt保存时出现“无法更正的错误”怎么办?

搜狗浏览器每次打开的窗口太小,请问怎样保存打开浏览器时的窗口大小是上次关闭时的位置和大小?

如何在 Pyqt5 环境中使用 Pickle 保存 Matplotlib 图?

按下保存按钮pyqt5后关闭第二个小部件