2016-08-18 7 views
0

私は、自分のプログラムの設定を編集する手段としてQtデザイナで設計したインタフェースを使用しようとしています。PyQtで設定ダイアログウィンドウを実装する

私は現在、私は好みのメニューオプションに次の関数を接続することによって作られた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の間でデータをやり取りする良い方法が不明です。

Here is a picture of the window for reference

答えて

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) 

[環境設定]ダイアログボックスがトリガされたとき、settingsPreferencesDialogに沿ってロードされ、渡されます。ダイアログが正常に返された場合は、新しい設定が保存され、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コンストラクタは、受信したパラメータに応じて値を設定し、AA pyqtSlotは値を保存するために、適切なsignalに取り付けられています。辞書に入れる。

if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 
:デモを実行するには

関連する問題