【发布时间】:2021-12-05 04:05:57
【问题描述】:
我对使用 QSettings 将单选按钮的状态从一个应用程序会话保存到另一个使用 PyQt5 的结果感到困惑。 (操作系统 = Ubuntu Linux 18.04)
这些是产生令人困惑的结果的步骤:
- 运行应用程序;查看选中的两个单选按钮;两个按钮都像鼠标被选中一样触发
- 取消选择顶部单选按钮
- 关闭应用程序;查看单选按钮选中状态的“正确”保存
- 运行应用程序;即使保存了仅选择一个按钮的不同状态,这两个单选按钮也会被选中
- 取消选择顶部单选按钮
- 关闭应用程序;查看单选按钮选中状态的“正确”保存
- 在代码中,第18行,将
QSettings('LoneProgrammer2', 'qsettingsTest1')改为QSettings('ChangeThis', 'qsettingsTest1');保存代码 - 运行应用程序; !!单选按钮选择反映了正确保存的值!!
- 关闭应用程序; 10 运行应用程序,现在再次选择了两个单选按钮!
谁能解释一下这里发生了什么?我只是想让 QSettings 工作。
import sys
from PyQt5.QtCore import QSettings
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QDialogButtonBox, QGroupBox, QHBoxLayout, QRadioButton
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.oAutoPromoteRadioBtn = QRadioButton("Automatically Promote to Queen")
self.oAutoPromoteRadioBtn.toggled.connect(self.on_selected)
self.oUsePopupRadioBtn = QRadioButton("Promote Pawn Using Popup Window")
self.oUsePopupRadioBtn.toggled.connect(self.on_selected)
self.oUsePopupRadioBtn.setChecked(True)
self.settings = QSettings('LoneProgrammer2', 'qsettingsTest1') # companyname, appname
self.settings.beginGroup("Promotion Dialog")
self.oAutoPromoteRadioBtn.setChecked(
bool(self.settings.value('auto-promote radio button checked state')))
self.oUsePopupRadioBtn.setChecked(
bool(self.settings.value('promote using popup radio button checked state')))
self.settings.endGroup()
print('AT APP OPENING:')
print('self.oAutoPromoteRadioBtn.isChecked() = ', self.oAutoPromoteRadioBtn.isChecked())
print('self.oUsePopupRadioBtn.isChecked() = ', self.oUsePopupRadioBtn.isChecked())
oVertLayoutForRadioButtons = QVBoxLayout()
oVertLayoutForRadioButtons.addWidget(self.oAutoPromoteRadioBtn)
oVertLayoutForRadioButtons.addWidget(self.oUsePopupRadioBtn)
self.groupbox = QGroupBox("Select pawn promotion method:")
self.groupbox.setFixedWidth(300)
self.groupbox.setFixedHeight(95)
self.groupbox.setLayout(oVertLayoutForRadioButtons)
self.oVertLayout = QVBoxLayout()
self.oVertLayout.addWidget(self.groupbox)
self.setLayout(self.oVertLayout)
def on_selected(self):
radio_button = self.sender()
if radio_button.isChecked():
if radio_button.text() == 'Automatically Promote to Queen':
print('set to auto-promote to queen')
elif radio_button.text() == 'Promote Pawn Using Popup Window':
print('set to promote pawn to queen using popup window')
def closeEvent(self, event):
# save the vars from this session
self.settings.beginGroup("Promotion Dialog")
self.settings.setValue('auto-promote radio button checked state', self.oAutoPromoteRadioBtn.isChecked())
self.settings.setValue('promote using popup radio button checked state', self.oUsePopupRadioBtn.isChecked())
self.settings.endGroup()
print()
print('AT APP CLOSE:')
print('self.oAutoPromoteRadioBtn.isChecked() = ', self.oAutoPromoteRadioBtn.isChecked())
print('self.oUsePopupRadioBtn.isChecked() = ', self.oUsePopupRadioBtn.isChecked())
if __name__ == "__main__":
app = QApplication(sys.argv)
demo = MyApp()
demo.show()
sys.exit(app.exec_())
【问题讨论】:
标签: python pyqt pyqt5 qsettings