class SettingsDialog(QDialog): def __init__(self, settings, callback, parent=None): super(SettingsDialog, self).__init__(parent) # Function to apply changes self.callback = callback self.settings = settings # Dialog properties self.resize(320, 190) self.setWindowTitle('Settings') # Create, connect and add Widgets self.createWidgets() self.createConnections() self.addWidgets() def createWidgets(self): numeric_reg = QRegExp(r"[0-9]+") self.line_width_label = QLabel('Line Width') self.line_width_edit = QLineEdit() self.line_width_edit.setValidator(QRegExpValidator(numeric_reg, self)) self.line_width_edit.setText(str(self.settings['plotLineWidth'])) self.horizontal_grid_label = QLabel('Horizontal Grid') self.horizontal_grid_checkbox = QCheckBox() self.horizontal_grid_checkbox.setChecked( self.settings['horizontalGrid']) self.vertical_grid_label = QLabel('Vertical Grid') self.vertical_grid_checkbox = QCheckBox() self.vertical_grid_checkbox.setChecked(self.settings['verticalGrid']) self.grid_opacity_label = QLabel('Line Opacity') self.grid_opacity_spinbox = QDoubleSpinBox() self.grid_opacity_spinbox.setRange(0.10, 1.00) self.grid_opacity_spinbox.setSingleStep(0.10) self.grid_opacity_spinbox.setValue(float(self.settings['gridOpacity'])) self.grid_opacity_spinbox.setFocusPolicy(Qt.NoFocus) self.line_color_label = QLabel('Line Color') self.line_color_combo = QComboBox() self.line_color_combo.addItem('blue') self.line_color_combo.addItem('cyan') self.line_color_combo.addItem('green') self.line_color_combo.addItem('magenta') self.line_color_combo.addItem('white') self.line_color_combo.addItem('yellow') print self.settings['lineColor'] self.line_color_combo.setCurrentIndex( self.line_color_combo.findText(self.settings['lineColor'])) self.serial_baud_label = QLabel('Serial Baud') self.serial_baud_edit = QLineEdit() self.serial_baud_edit.setText(str(self.settings['serialBaud'])) self.serial_baud_edit.setValidator(QRegExpValidator(numeric_reg, self)) self.separator_label = QLabel('Separator') self.separator_edit = QLineEdit() self.separator_edit.setText(self.settings['separator']) self.separator_edit.setInputMask('X') self.buttonBox = QDialogButtonBox(QDialogButtonBox.Apply | QDialogButtonBox.Close | QDialogButtonBox.RestoreDefaults) # Connect elements to their events def createConnections(self): self.buttonBox.button(QDialogButtonBox.Apply).clicked.connect( self.apply) self.buttonBox.button(QDialogButtonBox.Apply).setDefault(True) self.buttonBox.button(QDialogButtonBox.Apply).setAutoDefault(True) self.buttonBox.rejected.connect(self.reject) self.buttonBox.button( QDialogButtonBox.RestoreDefaults).clicked.connect( self.restore_defaults) self.buttonBox.button( QDialogButtonBox.RestoreDefaults).setDefault(False) self.buttonBox.button( QDialogButtonBox.RestoreDefaults).setAutoDefault(False) # Add elements to the GUI def addWidgets(self): grid = QGridLayout() grid.addWidget(self.line_width_label, 0, 0) grid.addWidget(self.line_width_edit, 0, 1) grid.addWidget(self.horizontal_grid_label, 1, 0) grid.addWidget(self.horizontal_grid_checkbox, 1, 1) grid.addWidget(self.vertical_grid_label, 2, 0) grid.addWidget(self.vertical_grid_checkbox, 2, 1) grid.addWidget(self.grid_opacity_label, 3, 0) grid.addWidget(self.grid_opacity_spinbox, 3, 1) grid.addWidget(self.line_color_label, 4, 0) grid.addWidget(self.line_color_combo, 4, 1) grid.addWidget(self.serial_baud_label, 5, 0) grid.addWidget(self.serial_baud_edit, 5, 1) grid.addWidget(self.separator_label, 6, 0) grid.addWidget(self.separator_edit, 6, 1) grid.addWidget(self.buttonBox, 7, 0, 1, 2) self.setLayout(grid) # Apply new Settings def apply(self): # dict(plotLineWidth=1, horizontalGrid=True, verticalGrid=True, gridOpacity=1, lineColor='b', # arrayPlotSize=25, updatePlotTime=1) self.settings['plotLineWidth'] = int(self.line_width_edit.text()) self.settings[ 'horizontalGrid'] = self.horizontal_grid_checkbox.isChecked() self.settings['verticalGrid'] = self.vertical_grid_checkbox.isChecked() self.settings['gridOpacity'] = float(self.grid_opacity_spinbox.value()) self.settings['lineColor'] = unicode( self.line_color_combo.currentText()) self.settings['serialBaud'] = int(self.serial_baud_edit.text()) if len(self.separator_edit.text()) != 1: self.settings['separator'] = ' ' else: self.settings['separator'] = unicode(self.separator_edit.text()) self.callback() # Restores default settings values def restore_defaults(self): default_values = dict(plotLineWidth=1, horizontalGrid=True, verticalGrid=True, gridOpacity=1, lineColor='b', arrayPlotSize=25, serialBaud=115200, separator=' ') self.settings.update(default_values) self.callback() self.line_width_edit.setText(str(self.settings['plotLineWidth'])) self.horizontal_grid_checkbox.setChecked( self.settings['horizontalGrid']) self.vertical_grid_checkbox.setChecked(self.settings['verticalGrid']) self.grid_opacity_spinbox.setValue(self.settings['gridOpacity']) self.line_color_combo.setCurrentIndex(0) self.serial_baud_edit.setText(str(self.settings['serialBaud'])) self.separator_edit.setText(self.settings['separator'])