无法在 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 上保存我的窗口的大小和位置的主要内容,如果未能解决你的问题,请参考以下文章
搜狗浏览器每次打开的窗口太小,请问怎样保存打开浏览器时的窗口大小是上次关闭时的位置和大小?