【问题标题】:Implementing a preferences dialog window in PyQt在 PyQt 中实现首选项对话框窗口
【发布时间】:2016-08-18 16:48:42
【问题描述】:

我正在尝试使用我在 Qt 设计器中设计的界面作为让用户编辑我的程序首选项的一种方式。

我目前可以通过将以下功能连接到首选项菜单选项来显示我制作的 GUI:

def preferences(self):

    preferences_dialog = QtGui.QDialog()
    preferences_dialog.ui = Ui_Preferences()
    preferences_dialog.ui.setupUi(preferences_dialog)
    preferences_dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    preferences_dialog.exec_()

我的问题是:什么是实现它的好方法,以便我可以使用 GUI 中的字段来更改我的配置文件中的值?

我还想在更改之前在框中显示预先存在的值。

我应该创建一个使用上述函数作为其 __init__ 方法的新类吗?我想我可能需要一个处理窗口所有进程的类。此外,我不确定在没有一堆特定代码的情况下在文件和 GUI 之间传递数据的好方法。

【问题讨论】:

    标签: python user-interface pyqt pyqt4


    【解决方案1】:

    使用QSettings。这是 PyQt5 中的一个示例。

    一、主窗口的ui定义

    # file ui_main.py
    from PyQt5 import QtCore, QtWidgets
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(584, 897)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 584, 21))
            self.menubar.setObjectName("menubar")
            self.menuPreferences = QtWidgets.QMenu(self.menubar)
            self.menuPreferences.setObjectName("menuPreferences")
            MainWindow.setMenuBar(self.menubar)
            self.setPreferencesAction = QtWidgets.QAction(MainWindow)
            self.setPreferencesAction.setObjectName("setPreferencesAction")
            self.menuPreferences.addAction(self.setPreferencesAction)
            self.menubar.addAction(self.menuPreferences.menuAction())
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.menuPreferences.setTitle(_translate("MainWindow", "Settings"))
            self.setPreferencesAction.setText(_translate("MainWindow", "Preferences"))
    

    第二,首选项对话框ui定义:

    # file ui_dialog.py
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_Dialog(object):
        def setupUi(self, Dialog):
            Dialog.setObjectName("Dialog")
            Dialog.resize(508, 300)
            self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
            self.buttonBox.setGeometry(QtCore.QRect(150, 250, 341, 32))
            self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
            self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
            self.buttonBox.setObjectName("buttonBox")
            self.sl_value = QtWidgets.QSlider(Dialog)
            self.sl_value.setGeometry(QtCore.QRect(220, 120, 161, 31))
            self.sl_value.setOrientation(QtCore.Qt.Horizontal)
            self.sl_value.setObjectName("sl_value")
            self.buttonBox.accepted.connect(Dialog.accept)
            self.buttonBox.rejected.connect(Dialog.reject)
            QtCore.QMetaObject.connectSlotsByName(Dialog)
    

    MainWindow 跟踪 QSettings 对象中的配置,该对象是使用输入其构造函数的 applicationcompany 字符串唯一定义(和访问)的。

    # file main.py
    class MainWindow(QMainWindow):
    
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
    
            self.settings = QSettings(COMPANY_NAME, APPLICATION_NAME)
    
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
    

    当触发首选项对话框时,settings 被加载并传递给PreferencesDialog。如果对话框成功返回,则使用del 保存新设置并写入存储中

        @pyqtSlot(bool)
        def on_setPreferencesAction_triggered(self, triggered):
            settings = self.settings
            default_config_value = settings.value(CONFIG_KEY_1, defaultValue=None, type=str)
    
            preference_dialog = PreferencesDialog(default_config_value=default_config_value, parent=self)
            if preference_dialog.exec():
                settings.setValue(CONFIG_KEY_1, preference_dialog.preferences[CONFIG_KEY_1])
    
                # this writes the settings to storage
                del settings
    

    PreferencesDialog 构造函数根据它接收的参数设置值,并将pyqtSlot 附加到相应的signal 以将值保存在字典中。

    运行演示:

    if __name__ == '__main__':
        import sys
    
        app = QApplication(sys.argv)
        window = MainWindow()
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多