<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def optsChanged(self, param, opts):
 """Called when any options are changed that are not name, value, default, or limits"""

        # print "opts changed:", opts
        ParameterItem.optsChanged(self, param, opts)
        w = self.widget
        if 'readonly' in opts:
            self.updateDefaultBtn()
            if isinstance(w, (QtWidgets.QCheckBox, ColorButton)):
                w.setEnabled(not opts['readonly'])

        # If widget is a SpinBox, pass options straight through
        if isinstance(self.widget, SpinBox):
            if 'units' in opts and 'suffix' not in opts:
                opts['suffix'] = opts['units']
            w.setOpts(**opts)
            self.updateDisplayLabel()