Configuring widgets
In this chapter we will extend the class made in the previous chapter, adding default values and ranges to the widgets of our window.
Getting references to the widgets in our window
The first step is to get a reference to each of the widgets we want to use. As we are loading the UI from a file, we have to extract those references from the main widget loaded:
def setupUI(self):
# Load UI and set it as main layout
ui_file_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'PCBOutlineCreator.ui')
main_widget = load_ui(ui_file_path, self)
layout = QtGui.QVBoxLayout()
layout.addWidget(main_widget)
self.setLayout(layout)
# Get a reference to all required widgets
self.inputFileButton = self.findChild(QtGui.QToolButton, 'inputFileButton')
self.inputFileLineEdit = self.findChild(QtGui.QLineEdit, 'inputFileLineEdit')
self.exportButton = self.findChild(QtGui.QPushButton, 'exportButton')
self.saveButton = self.findChild(QtGui.QPushButton, 'saveButton')
self.lengthSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'lengthSpinBox')
self.widthSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'widthSpinBox')
self.lineWidthSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'lineWidthSpinBox')
self.cornersSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'cornersSpinBox')
self.cornersCheckBox = self.findChild(QtGui.QCheckBox, 'cornersCheckBox')
self.xSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'xSpinBox')
self.ySpinBox = self.findChild(QtGui.QDoubleSpinBox, 'ySpinBox')
For each widget, we have to specify as arguments the type of widget (class) and the name of the widget in the UI file.
Configuring default values for widgets
Once we have the references to the widgets, we can define a reset function that sets the default values to the different widgets:
def resetValues(self):
self.lengthSpinBox.setValue(50)
self.widthSpinBox.setValue(50)
self.lineWidthSpinBox.setValue(0.2)
self.cornersCheckBox.setChecked(False)
self.cornersSpinBox.setValue(5)
self.xSpinBox.setValue(0)
self.ySpinBox.setValue(0)
If we want these values set as default values from the start, we will need to call that function on our init routine:
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUI()
self.resetValues()
And the resultant window will look like this:
Setup widget ranges
The different spin boxes that we have added to our window have different ranges. For example, the offset values can be negative, but the length and width cannot. For that reason, we will have to configure the widgets range:
def setupUI(self):
# Load UI and set it as main layout
ui_file_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'PCBOutlineCreator.ui')
main_widget = load_ui(ui_file_path, self)
layout = QtGui.QVBoxLayout()
layout.addWidget(main_widget)
self.setLayout(layout)
# Get a reference to all required widgets
self.inputFileButton = self.findChild(QtGui.QToolButton, 'inputFileButton')
self.inputFileLineEdit = self.findChild(QtGui.QLineEdit, 'inputFileLineEdit')
self.exportButton = self.findChild(QtGui.QPushButton, 'exportButton')
self.saveButton = self.findChild(QtGui.QPushButton, 'saveButton')
self.lengthSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'lengthSpinBox')
self.widthSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'widthSpinBox')
self.lineWidthSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'lineWidthSpinBox')
self.cornersSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'cornersSpinBox')
self.cornersCheckBox = self.findChild(QtGui.QCheckBox, 'cornersCheckBox')
self.xSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'xSpinBox')
self.ySpinBox = self.findChild(QtGui.QDoubleSpinBox, 'ySpinBox')
# Configure widget ranges:
max_float = sys.float_info.max
self.lengthSpinBox.setMinimum(0)
self.lengthSpinBox.setMaximum(max_float)
self.widthSpinBox.setMinimum(0)
self.widthSpinBox.setMaximum(max_float)
self.lineWidthSpinBox.setMinimum(0)
self.lineWidthSpinBox.setMaximum(max_float)
self.lineWidthSpinBox.setSingleStep(0.1)
self.cornersSpinBox.setMinimum(0)
self.cornersSpinBox.setMaximum(max_float)
self.xSpinBox.setMinimum(-max_float)
self.xSpinBox.setMaximum(max_float)
self.ySpinBox.setMinimum(-max_float)
self.ySpinBox.setMaximum(max_float)
In the next chapter we will learn how to attach callbacks to events so that our widgets can perform actions when we interact with them.
Complete code
from PySide import QtCore,QtGui
from PySide import QtUiTools
import os, sys
def load_ui(file_name, where=None):
"""
Loads a .UI file into the corresponding Qt Python object
:param file_name: UI file path
:param where: Use this parameter to load the UI into an existing class (i.e. to override methods)
:return: loaded UI
"""
# Create a QtLoader
loader = QtUiTools.QUiLoader()
# Open the UI file
ui_file = QtCore.QFile(file_name)
ui_file.open(QtCore.QFile.ReadOnly)
# Load the contents of the file
ui = loader.load(ui_file, where)
# Close the file
ui_file.close()
return ui
class PCBOutlineCreator(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUI()
self.resetValues()
def setupUI(self):
# Load UI and set it as main layout
ui_file_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'PCBOutlineCreator.ui')
main_widget = load_ui(ui_file_path, self)
layout = QtGui.QVBoxLayout()
layout.addWidget(main_widget)
self.setLayout(layout)
# Get a reference to all required widgets
self.inputFileButton = self.findChild(QtGui.QToolButton, 'inputFileButton')
self.inputFileLineEdit = self.findChild(QtGui.QLineEdit, 'inputFileLineEdit')
self.exportButton = self.findChild(QtGui.QPushButton, 'exportButton')
self.saveButton = self.findChild(QtGui.QPushButton, 'saveButton')
self.lengthSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'lengthSpinBox')
self.widthSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'widthSpinBox')
self.lineWidthSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'lineWidthSpinBox')
self.cornersSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'cornersSpinBox')
self.cornersCheckBox = self.findChild(QtGui.QCheckBox, 'cornersCheckBox')
self.xSpinBox = self.findChild(QtGui.QDoubleSpinBox, 'xSpinBox')
self.ySpinBox = self.findChild(QtGui.QDoubleSpinBox, 'ySpinBox')
# Configure widget ranges:
max_float = sys.float_info.max
self.lengthSpinBox.setMinimum(0)
self.lengthSpinBox.setMaximum(max_float)
self.widthSpinBox.setMinimum(0)
self.widthSpinBox.setMaximum(max_float)
self.lineWidthSpinBox.setMinimum(0)
self.lineWidthSpinBox.setMaximum(max_float)
self.lineWidthSpinBox.setSingleStep(0.1)
self.cornersSpinBox.setMinimum(0)
self.cornersSpinBox.setMaximum(max_float)
self.xSpinBox.setMinimum(-max_float)
self.xSpinBox.setMaximum(max_float)
self.ySpinBox.setMinimum(-max_float)
self.ySpinBox.setMaximum(max_float)
def resetValues(self):
self.lengthSpinBox.setValue(50)
self.widthSpinBox.setValue(50)
self.lineWidthSpinBox.setValue(0.2)
self.cornersCheckBox.setChecked(False)
self.cornersSpinBox.setValue(5)
self.xSpinBox.setValue(0)
self.ySpinBox.setValue(0)
if __name__ == '__main__':
# Create Qt app
app = QtGui.QApplication(sys.argv)
# Create the widget and show it
gui = PCBOutlineCreator()
gui.show()
# Run the app
sys.exit(app.exec_())