Index: src/sas/qtgui/Perspectives/Fitting/FittingLogic.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision 61f0c75f21788f08492f16b51fa253507d1e8423)
+++ src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision 61f0c75f21788f08492f16b51fa253507d1e8423)
@@ -220,4 +220,15 @@
         return plots
 
+    def getScalarIntermediateResults(self, return_data):
+        """
+        Returns a dict of scalar-only intermediate results from the return data.
+        """
+        res = {}
+        for name, int_res in return_data["intermediate_results"].items():
+            if isinstance(int_res, np.ndarray):
+                continue
+            res[name] = int_res
+        return res
+
     def computeDataRange(self):
         """
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision bb477f548ae5ba590f954cce573627bdb5c105f3)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision bb477f548ae5ba590f954cce573627bdb5c105f3)
@@ -2229,4 +2229,8 @@
         # TODO: multishell params in self.kernel_module.details[??] = value
 
+        # handle display of effective radius parameter according to radius_effective_mode; pass ER into model if
+        # necessary
+        self.processEffectiveRadius()
+
         # Force the chart update when actual parameters changed
         if model_column == 1:
@@ -2235,4 +2239,64 @@
         # Update state stack
         self.updateUndo()
+
+    def processEffectiveRadius(self):
+        """
+        Checks the value of radius_effective_mode, if existent, and processes radius_effective as necessary.
+        * mode == 0: This means 'unconstrained'; ensure use can specify ER.
+        * mode > 0: This means it is constrained to a P(Q)-computed value in sasmodels; prevent user from editing ER.
+
+        Note: If ER has been computed, it is passed back to SasView as an intermediate result. That value must be
+        displayed for the user; that is not dealt with here, but in complete1D.
+        """
+        ER_row = self.getRowFromName("radius_effective")
+        if ER_row is None:
+            return
+
+        ER_mode_row = self.getRowFromName("radius_effective_mode")
+        if ER_mode_row is None:
+            return
+
+        try:
+            ER_mode = int(self._model_model.item(ER_mode_row, 1).text())
+        except ValueError:
+            logging.error("radius_effective_mode was set to an invalid value.")
+            return
+
+        if ER_mode == 0:
+            # ensure the ER value can be modified by user
+            self.setParamEditableByRow(ER_row, True)
+        elif ER_mode > 0:
+            # ensure the ER value cannot be modified by user
+            self.setParamEditableByRow(ER_row, False)
+        else:
+            logging.error("radius_effective_mode was set to an invalid value.")
+
+    def setParamEditableByRow(self, row, editable=True):
+        """
+        Sets whether the user can edit a parameter in the table. If they cannot, the parameter name's font is changed,
+        the value itself cannot be edited if clicked on, and the parameter may not be fitted.
+        """
+        item_name = self._model_model.item(row, 0)
+        item_value = self._model_model.item(row, 1)
+
+        item_value.setEditable(editable)
+
+        if editable:
+            # reset font
+            item_name.setFont(QtGui.QFont())
+            # reset colour
+            item_name.setForeground(QtGui.QBrush())
+            # make checkable
+            item_name.setCheckable(True)
+        else:
+            # change font
+            font = QtGui.QFont()
+            font.setItalic(True)
+            item_name.setFont(font)
+            # change colour
+            item_name.setForeground(QtGui.QBrush(QtGui.QColor(50, 50, 50)))
+            # make not checkable (and uncheck)
+            item_name.setCheckState(QtCore.Qt.Unchecked)
+            item_name.setCheckable(False)
 
     def isCheckable(self, row):
@@ -2441,4 +2505,35 @@
             self.communicate.plotUpdateSignal.emit([plot])
 
+        # Update radius_effective if relevant
+        def updateRadiusEffective():
+            ER_mode_row = self.getRowFromName("radius_effective_mode")
+            if ER_mode_row is None:
+                return
+            try:
+                ER_mode = int(self._model_model.item(ER_mode_row, 1).text())
+            except ValueError:
+                logging.error("radius_effective_mode was set to an invalid value.")
+                return
+            if ER_mode < 1:
+                # does not need updating if it is not being computed
+                return
+
+            ER_row = self.getRowFromName("radius_effective")
+            if ER_row is None:
+                return
+
+            scalar_results = self.logic.getScalarIntermediateResults(return_data)
+            ER_value = scalar_results.get("effective_radius") # note name of key
+            if ER_value is None:
+                return
+            # ensure the model does not recompute when updating the value
+            self._model_model.blockSignals(True)
+            self._model_model.item(ER_row, 1).setText(str(ER_value))
+            self._model_model.blockSignals(False)
+            # ensure the view is updated immediately
+            self._model_model.layoutChanged.emit()
+
+        updateRadiusEffective()
+
     def complete2D(self, return_data):
         """
