From a9af707fb7e347634cc7e1cacf49c74ad6a698ce Mon Sep 17 00:00:00 2001 From: Ashwola Date: Tue, 28 Apr 2026 15:48:56 +0200 Subject: [PATCH 1/2] updateDefaultBtn becomes updateCtrlButton --- pyqtgraph/parametertree/ParameterItem.py | 13 +++++++++++-- pyqtgraph/parametertree/parameterTypes/checklist.py | 4 ++-- pyqtgraph/parametertree/parameterTypes/pen.py | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/pyqtgraph/parametertree/ParameterItem.py b/pyqtgraph/parametertree/ParameterItem.py index 9168c4f4d5..f8dc418156 100644 --- a/pyqtgraph/parametertree/ParameterItem.py +++ b/pyqtgraph/parametertree/ParameterItem.py @@ -399,11 +399,11 @@ def populateCtrlMenu(self): self.ctrlMenu.addSeparator() self._buildParamMenu(self.ctrlMenu, show_rename, show_remove) - def updateDefaultBtn(self): + def updateCtrlButton(self): """Refresh the ctrl button menu to reflect current parameter state. Called automatically on value and opts changes. Override in a subclass - to add custom refresh logic; call ``super().updateDefaultBtn()`` to + to add custom refresh logic; call ``super().updateCtrlButton()`` to retain the built-in menu refresh. When the menu is currently visible (e.g. a persistent action was just @@ -414,6 +414,15 @@ def updateDefaultBtn(self): if hasattr(self, 'ctrlMenu') and not self.ctrlMenu.isVisible(): self.populateCtrlMenu() + def updateDefaultBtn(self): + """Deprecated. Use :meth:`updateCtrlButton` instead.""" + warnings.warn( + "updateDefaultBtn is deprecated; use updateCtrlButton instead.", + DeprecationWarning, + stacklevel=2, + ) + self.updateCtrlButton() + def defaultClicked(self): self.param.setToDefault() diff --git a/pyqtgraph/parametertree/parameterTypes/checklist.py b/pyqtgraph/parametertree/parameterTypes/checklist.py index 8a290f9284..bc38fd7657 100644 --- a/pyqtgraph/parametertree/parameterTypes/checklist.py +++ b/pyqtgraph/parametertree/parameterTypes/checklist.py @@ -78,14 +78,14 @@ def optsChanged(self, param, opts): self.btnGrp.setExclusive(exclusive) # "Limits" will force update anyway, no need to duplicate if it's present if 'limits' not in opts and ('enabled' in opts or 'readonly' in opts): - self.updateDefaultBtn() + self.updateCtrlButton() def expandedChangedEvent(self, expanded): for btn in self.metaBtns.values(): btn.setVisible(expanded) def valueChanged(self, param, val): - self.updateDefaultBtn() + self.updateCtrlButton() class RadioParameterItem(BoolParameterItem): diff --git a/pyqtgraph/parametertree/parameterTypes/pen.py b/pyqtgraph/parametertree/parameterTypes/pen.py index a4c5aa7c32..9f729163cd 100644 --- a/pyqtgraph/parametertree/parameterTypes/pen.py +++ b/pyqtgraph/parametertree/parameterTypes/pen.py @@ -26,7 +26,7 @@ def __init__(self, param, depth): def optsChanged(self, param, opts): if "enabled" in opts or "readonly" in opts: - self.updateDefaultBtn() + self.updateCtrlButton() def treeWidgetChanged(self): ParameterItem.treeWidgetChanged(self) @@ -36,7 +36,7 @@ def treeWidgetChanged(self): tw.setItemWidget(self, 1, self.itemWidget) def valueChanged(self, param, val): - self.updateDefaultBtn() + self.updateCtrlButton() def cap_first(s: str): From 678f4148cf371fecf314bc0a4d7fa8f2464b69f4 Mon Sep 17 00:00:00 2001 From: Ashwola Date: Tue, 28 Apr 2026 15:49:18 +0200 Subject: [PATCH 2/2] updating docs + adding extra opts to hide ctrlBtn --- pyqtgraph/parametertree/Parameter.py | 37 +++++++++++++++++-- .../parametertree/parameterTypes/basetypes.py | 15 +++++--- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/pyqtgraph/parametertree/Parameter.py b/pyqtgraph/parametertree/Parameter.py index 10ea5b538c..2e1e3cf3e6 100644 --- a/pyqtgraph/parametertree/Parameter.py +++ b/pyqtgraph/parametertree/Parameter.py @@ -178,12 +178,43 @@ def __init__(self, **opts): syncExpanded If True, the `expanded` state of this Parameter is synchronized with all ParameterTrees it is displayed in. (default=False) - title (str or None) If specified, then the parameter will be - displayed to the user using this string as its name. - However, the parameter will still be referred to + title (str or None) If specified, then the parameter will be + displayed to the user using this string as its name. + However, the parameter will still be referred to internally using the *name* specified above. Note that this option is not compatible with renamable=True. (default=None; added in version 0.9.9) + context Specifies items for a context menu shown on right-click + and inside the ctrl button menu. Accepts a dict, list, + or tuple; nested structures produce submenus. See + :func:`~pyqtgraph.parametertree.ParameterItem.build_menu_from_iterable` + for the accepted format. Clicking an item emits + sigContextMenu with the full path tuple to that item. + (default=None) + ctrlActions A set of strings controlling which built-in actions + appear in the ctrl button menu (the gear icon shown by + widget-based parameter types). Valid values: + ``'default'`` (Reset to default), ``'setDefault'`` + (Set as default), ``'enabled'`` (Enable/Disable + toggle), ``'readonly'`` (Lock/Unlock toggle), + ``'rename'``, ``'remove'``. Including ``'rename'`` or + ``'remove'`` here is equivalent to setting + ``renamable=True`` / ``removable=True``. + (default: {'default', 'setDefault', 'enabled', + 'readonly'}) + icon An icon to display next to the parameter name in a + ParameterTree. Accepts a QIcon instance, a file path + string, or a QIcon.StandardPixmap value. Pass None to + remove the icon. See also :meth:`setIcon`. + (default=None) + showCtrlButton If False, the ctrl button (gear icon) will be hidden + for widget-based parameter types. The button can be + shown again later via ``setOpts(showCtrlButton=True)``. + (default=True) + movable If True, the parameter item can be dragged within a + ParameterTree (sets ItemIsDragEnabled). (default=False) + dropEnabled If True, the parameter item accepts drops from other + items (sets ItemIsDropEnabled). (default=False) ======================= ========================================================= """ super().__init__() diff --git a/pyqtgraph/parametertree/parameterTypes/basetypes.py b/pyqtgraph/parametertree/parameterTypes/basetypes.py index 4767ae1225..51cbfb5b05 100644 --- a/pyqtgraph/parametertree/parameterTypes/basetypes.py +++ b/pyqtgraph/parametertree/parameterTypes/basetypes.py @@ -37,6 +37,8 @@ def __init__(self, param, depth): self.addChild(self.subItem) self.ctrlBtn = self.makeCtrlButton() + if not param.opts.get('showCtrlButton', True): + self.ctrlBtn.hide() self.displayLabel = QtWidgets.QLabel() @@ -65,7 +67,7 @@ def __init__(self, param, depth): ## no starting value was given; use whatever the widget has self.widgetValueChanged() - self.updateDefaultBtn() + self.updateCtrlButton() self.optsChanged(self.param, self.param.opts) @@ -136,7 +138,7 @@ def valueChanged(self, param, val, force=False): self.widget.sigChanged.connect(self.widgetValueChanged) self.param.sigValueChanged.connect(self.valueChanged) self.updateDisplayLabel() ## always make sure label is updated, even if values match! - self.updateDefaultBtn() + self.updateCtrlButton() def updateDisplayLabel(self, value=None): """Update the display label to reflect the value of the parameter.""" @@ -181,7 +183,7 @@ def limitsChanged(self, param, limits): ParameterItem.limitsChanged(self, param, limits) def defaultChanged(self, param, value): - self.updateDefaultBtn() + self.updateCtrlButton() def treeWidgetChanged(self): """Called when this item is added or removed from a tree.""" @@ -205,11 +207,11 @@ def optsChanged(self, param, opts): ParameterItem.optsChanged(self, param, opts) if 'enabled' in opts: - self.updateDefaultBtn() + self.updateCtrlButton() self.widget.setEnabled(opts['enabled']) if 'readonly' in opts: - self.updateDefaultBtn() + self.updateCtrlButton() if opts['readonly']: self.displayLabel.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.TextSelectableByMouse) @@ -221,6 +223,9 @@ def optsChanged(self, param, opts): else: self.widget.setEnabled(self.param.opts['enabled'] and not opts['readonly']) + if 'showCtrlButton' in opts: + self.ctrlBtn.setVisible(opts['showCtrlButton']) + if 'tip' in opts: self.widget.setToolTip(opts['tip'])