schrodinger.ui.qt.swidgets module

Contains modifications of Qt widgets to allow for easier creation and use, and also general functions for dealing with Qt widgets.

schrodinger.ui.qt.swidgets.SUP_TEXT(x)
schrodinger.ui.qt.swidgets.SUB_TEXT(x)
class schrodinger.ui.qt.swidgets.SubWidget(label, widget, layout_type)

Bases: tuple

label

Alias for field number 0

layout_type

Alias for field number 2

widget

Alias for field number 1

class schrodinger.ui.qt.swidgets.SLabel(*args, layout=None, tip=None, **kwargs)

Bases: PyQt6.QtWidgets.QLabel

A QLabel that can pack itself into a layout upon creation

__init__(*args, layout=None, tip=None, **kwargs)

Create a SLabel instance

Parameters
  • layout (QLayout) – layout to place the label in

  • tip (str) – The tooltip for this label

reset()

Reset the label to its original text

class schrodinger.ui.qt.swidgets.ElidedLabel(*args, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SLabel

Just like a QLabel, except that the text is truncated at the end if it doesn’t fit. Full text is shown in the tooltip.

__init__(*args, **kwargs)

Create a SLabel instance

Parameters
  • layout (QLayout) – layout to place the label in

  • tip (str) – The tooltip for this label

setText(self, a0: str)
resizeEvent(self, a0: QResizeEvent)
schrodinger.ui.qt.swidgets.elide_rich_text(rich_text: str, font_metrics: PyQt6.QtGui.QFontMetrics, width: int, elide_type=TextElideMode.ElideRight)

Using the given width and font metrics, generate the elided text and fit it into the parsed html.

Parameters
  • rich_text – the source rich text that needs to be elided

  • font_metrics – the metrics to calculate the horizontal advance

  • width – maximum width before cutting off the html with ellipsis

  • elide_type – where to place the ellipsis

Returns

new formatted html string to display

class schrodinger.ui.qt.swidgets.ElidedTextHTMLParser(*args, **kwargs)

Bases: html.parser.HTMLParser

HTML Parser used for parsing rich text and then eliding it given a width and font metrics.

This parser should only be fed single line html.

class HTMLType(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)

Bases: enum.Enum

START_TAG = 1
END_TAG = 2
TEXT = 3
__init__(*args, **kwargs)

Initialize and reset this instance.

If convert_charrefs is True (the default), all character references are automatically converted to the corresponding Unicode characters.

handle_starttag(tag, attrs)
handle_endtag(tag)
handle_data(data)
elideRichText(font_metrics: PyQt6.QtGui.QFontMetrics, width: int, elide_type=TextElideMode.ElideRight)

Elides the rich text inside the html.

See documentation for elide_rich_text.

class schrodinger.ui.qt.swidgets.ImageLabel(*args, image=None, width=None, height=None, **kwargs)

Bases: PyQt6.QtWidgets.QLabel

A label that draws an image. High resolution images will be scaled down to the specified size. Works as expected on high resolution (e.g. Retina) displays.

__init__(*args, image=None, width=None, height=None, **kwargs)

Create a label. Optionally specify the image by passing in image, width, and height arguments.

Parameters
  • image (QImage) – Image to draw in the label.

  • width (int or float) – Width to scale down the image to.

  • height (int or float) – Height to scale down the image to.

setImage(image, width, height)

Set the image to draw, and the dimensions to scale it down to.

Parameters
  • image (QImage) – Image to draw in the label.

  • width (int or float) – Width to scale down the image to.

  • height (int or float) – Height to scale down the image to.

setText(self, a0: str)
paintEvent(event)

If an image is set, paint it in the widget. Otherwise, use default paintEvent.

sizeHint()

If an image is set, force the label to be the size of the image.

sizePolicy()

If an image is set, force the label to be fixed size.

class schrodinger.ui.qt.swidgets.ResizablePictureLabel

Bases: PyQt6.QtWidgets.QLabel

Label that automatically resizes its QPicture as the widget is resized. To keep the aspect ratio, padding is added to top&bottom or left&right sides as needed. To set a background color, use the “background-color” style sheet.

paintEvent(self, a0: QPaintEvent)
class schrodinger.ui.qt.swidgets.Spinner(*args, **kwargs)

Bases: PyQt6.QtWidgets.QLabel

A QLabel that shows a rotating spinner icon.

__init__(*args, **kwargs)

Create a Spinner instance.

startAnimation()

Show an animated spinner icon.

stopAnimation()

Stop animation of the spinner icon.

rotateIcon()
class schrodinger.ui.qt.swidgets.SpinnerIcon(parent=None)

Bases: PyQt6.QtGui.QMovie

Animates a “loading” icon that can be used by any Qt object that has the setIcon method.

Example:

def startTask(self):

self.button = QtWidgets.QPushButton(‘Button’)

self.loading_icon = bwidgets.SpinnerIcon(self) self.loading_icon.startSpinner(self.button)

self.launchTask()

def taskCallback(self):

self.loading_icon.stopSpinner()

GIF_FNAME = 'blue-loading.gif'
__init__(parent=None)
startSpinner(qt_obj)

Set the qt_obj’s icon to a loading icon.

Parameters

qt_obj – Object to set icon for. Must have setIcon method.

cycle()

The callback for the frameChanged signal. This will grab the pixmap of the current frame and create an icon from it. It then sets the self.qt_obj’s icon to this icon.

stopSpinner()

Removes the loading icon and sets the object’s icon back to the original icon

class schrodinger.ui.qt.swidgets.LargeSpinner(*args, **kwargs)

Bases: PyQt6.QtWidgets.QLabel

A QLabel that shows a large rotating spinner icon.

__init__(*args, **kwargs)
startAnimation()

Start the spinner

stopAnimation()

Stop the spinner

setIcon(icon)

For compatibility with the SpinnerIcon class.

Parameters

icon (QtGui.QIcon or QtGui.QMovie) – Icon to be set

icon()

For compatibility with the SpinnerIcon class.

class schrodinger.ui.qt.swidgets.SValidIndicator(state=0, layout=None, tips=None)

Bases: schrodinger.ui.qt.swidgets.SLabel, object

An SLabel that easily changes between a valid icon and an invalid icon

__init__(state=0, layout=None, tips=None)

Create an SValidIndicator instance

Parameters
  • state (int) – The initial state of the indicator. Should be one of the module constants INDICATOR_VALID, INDICATOR_INTERMEDIATE, INDICATOR_INVALID

  • layout (QtWidgets.QBoxLayout) – The layout to place the SValidIndicator in

  • tips (dict) – The tooltips for the indicator in its various states. Keys should be the possible states (INDICATOR_VALID, etc.) and values should be the corresponding tooltip. Tooltips are optional and may also be provided directly by setState. If no tooltips are provided in either place, the icon will have no tooltip.

createPixmaps()

Create the pixmaps for the indicator states.

setState(state, tip=None)

Set the state of the indicator

Parameters
  • state (int) – The new state of the indicator. Should be one of the module constants INDICATOR_VALID, INDICATOR_INTERMEDIATE, INDICATOR_INVALID

  • tip (str) – The new tooltip for the indicator. If not provided, the tooltips, if any, provided to the constructor will be used.

Raises

RuntimeError – If no icon corresponds to state

getState()

Get the state of the indicator

Return type

int

Returns

The state of the indicator. Will be one of the module constants INDICATOR_VALID, INDICATOR_INTERMEDIATE, INDICATOR_INVALID

reset()

Set the indicator to its initial state

class schrodinger.ui.qt.swidgets.VerticalLabel(*args, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SLabel

This creates a vertical label with property size, position, and enabled/disabled states.

__init__(*args, **kwargs)

Create a label and set default state.

paintEvent(event)

Overwrite parent method. Create a painter with drawn text and tunable colors.

See parent class for additional documentation.

setEnabled(state)

Enable/disable the label by changing the color.

Parameters

state (bool) – True, if the label widget is enabled.

minimumSizeHint()

Overwrite parent method.

sizeHint()

Overwrite parent method.

class schrodinger.ui.qt.swidgets.SLineEdit(*args, validator=None, layout=None, width=None, min_width=None, read_only=False, always_valid=False, show_clear=False, show_search_icon=False, placeholder_text=None, tip=None, **kwargs)

Bases: PyQt6.QtWidgets.QLineEdit

A QLineEdit that accepts a validator as one of its arguments

AV_ERROR_MSG = 'always_valid must be used in conjuction with a QValidator that has a restoreLastValidValue method.'
__init__(*args, validator=None, layout=None, width=None, min_width=None, read_only=False, always_valid=False, show_clear=False, show_search_icon=False, placeholder_text=None, tip=None, **kwargs)

Create a SLineEdit instance. The initial text of this edit will be used by the reset method to reset the SLineEdit.

Parameters
  • validator (QValidator) – The validator used for this LineEdit

  • layout (QLayout) – layout to place the LineEdit in

  • width (int) – limit on the maximum width of the QLineEdit

  • min_width (int) – limit on the minimum width of the QLineEdit

  • read_only (bool) – Whether the edit is read only

  • always_valid (bool) – If True, the SLineEdit will always restore the last valid value when it loses focus. This prevents blank SLineEdits or SLineEdits with only partially valid values at run time. If False (default), no modification of the SLineEdit value will occur when it loses focus.

  • show_clear (bool) – Whether to show a clear button in the line edit

  • show_search_icon (bool) – Whether to show a magnifying glass icon.

  • placeholder_text (str) – The placeholder text for the edit. This is the text that shows up when the line edit is empty and gives a hint to the user of what to enter.

  • tip (str) – The tooltip for the label

setText(text, only_if_valid=False)

Set the text of the edit.

Parameters
  • text (str) – The text to set in the edit

  • only_if_valid (bool) – Only set the text if it validates as acceptable via the edit’s validator.

setToAlwaysValid()

Set this instance to always replace invalid text with valid text per validation performed by self.validator

NOTE: The original value is never validated, so we need to set the validator last_valid_value property by hand. Note that forcing a validation here doesn’t work - appears to be a PyQt bug (or feature) where validation doesn’t work inside the __init__method. store it as the last valid value.

setClearButton(show_clear)

This function sets up the clearButton depending on whether the line edit is using it or not. :param show_clear: Whether to show the button or not (at any time) :type show_clear: bool

resizeEvent(resize_event)

This is used to place the clear text button

updateClearButton(text)

Show the clear button if it’s turned on, and the text is non-empty

reset()

Reset the LineEdit to its original text

float()

Returns the current value of the LineEdit as a float

Return type

float

Returns

Current float value of the LineEdit

int()

Returns the current value of the LineEdit as a float

Return type

int

Returns

Current int value of the LineEdit

getString()

Returns the current value of the LineEdit as a string

Return type

str

Returns

The current string value of the LineEdit

eventFilter(edit, event)

Filter FocusOut events so we can restore the last valid value

Note: This could have been done in the event() method rather than eventFilter() method, but doing it this way allows us to NOT process events for line edits that don’t always_valid validity, which saves on overhead.

Parameters
  • edit (QWidget) – The widget that generated this event - will be this instance (self)

  • event (QEvent) – The QEvent object generated by the event

Return type

bool

Returns

Whether event processing should stop for this event

class schrodinger.ui.qt.swidgets.SLabeledEdit(text='', edit_text='', side='left', stretch=True, after_label='', layout=None, tip=None, indicator=False, indicator_state=True, indicator_tips=None, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SLineEdit

An SLineEdit that has a label attached to it.

A SLabledEdit instance has a .label property that is an SLabel widget. The SLabeledEdit instance also has a .mylayout property that the label and edit are placed into. This .mylayout should be added to another layout in order to place the widgets into the GUI if the layout= keyword is not used during construction.

__init__(text='', edit_text='', side='left', stretch=True, after_label='', layout=None, tip=None, indicator=False, indicator_state=True, indicator_tips=None, **kwargs)

Create a SLabeledEdit instance. The initial text of this edit and labels will be used by the reset method to reset the SLineEdit and labels.

Parameters
  • text (str) – The text of the label

  • edit_text (str) – The initial text of the LineEdit

  • side (str) – ‘left’ if the label should appear to the left of the Line Edit (default), or ‘top’ if the label should appear above it

  • stretch (bool) – Whether to put a stretch after the LineEdit (or after the after_label). Default is True, even if side=’top’.

  • after_label (str) – Label text to put after the LineEdit - default is None

  • layout (QLayout) – layout to place the LabeledEdit in

  • tip (str) – The tooltip to apply to the labels and edit

  • indicator (bool) – True if a valid/invalid indicator should be appended

  • indicator_state (int) – The default state of the indicator (INDICATOR_VALID, INDICATOR_INVALID or INDICATOR_INTERMEDIATE)

  • indicator_tips (dict) – The tooltips for the different states of the indicator - see the SValidIndicator class for more information

reset()

Reset the label and line edit to their default values

setEnabled(state)

Set all child widgets to enabled state of state

Parameters

state (bool) – True if widgets should be enabled, False if not

setVisible(state)

Set all child widgets to visible state of state

Parameters

state (bool) – True if widgets should be visible, False if not

setIndicator(state, tip=None)

Set the state of the indicator icon

Parameters
  • state (int) – The new state of the indicator. Should be one of the module constants INDICATOR_VALID, INDICATOR_INTERMEDIATE, INDICATOR_INVALID

  • tip (str) – The new tooltip for the indicator icon - if not provided, the tooltips, if any, given to the constructor will be used.

class schrodinger.ui.qt.swidgets.SPushButton(*args, command=None, fixed=True, layout=None, tip=None, **kwargs)

Bases: PyQt6.QtWidgets.QPushButton

A QPushButton that accepts the command callback for the clicked() signal as an argument

__init__(*args, command=None, fixed=True, layout=None, tip=None, **kwargs)

Accepts all arguments normally given for a QPushButton

Parameters
  • command (function) – function to call when the button emits a ‘clicked()’ signal

  • fixed (bool) – if True (default), the button horizontal size policy will be ‘fixed’. If false, it will be the QtWidgets.QPushButton default. Otherwise, the horizontal policy will be set to the value given by this parameter.

  • layout (QLayout) – layout to place the button in

  • tip (str) – The tooltip for the button

class schrodinger.ui.qt.swidgets.SCheckBox(*args, command=None, layout=None, checked=False, disabled_checkstate=None, tip=None, **kwargs)

Bases: PyQt6.QtWidgets.QCheckBox

A QCheckBox that accepts the command callback for the clicked() signal as an argument

__init__(*args, command=None, layout=None, checked=False, disabled_checkstate=None, tip=None, **kwargs)

Accepts all arguments normally given for a QCheckBox

Parameters
  • command (function) – function to call when the checkbox emits a ‘clicked()’ signal

  • layout (QLayout) – layout to place the CheckBox in

  • checked (bool) – True if checked to start with, False (default) if not. This is also the state the reset method restores.

  • disabled_checkstate (bool) – The check state the box should assume when it is disabled. Upon being re-enabled, the box will return to the same state it had prior to being disabled. Calling setChecked() on a disabled box will not actually change the state, but will change the state the box returns to upon being enabled. Use forceSetChecked() to change the current and re-enabled state of a disabled checkbox. The default of None avoids special behavior for disabled checkboxes.

  • tip (str) – The tooltip for the checkbox

reset()

Reset the checkbox to its initial state

trackAbleState()

Check whether we need to track the checkstate of this widget when it is enabled/disabled

Return type

bool

Returns

Whether we should track the checkstate

changeEvent(event)

Overrides the parent method to save & change the checkstate when the widget is enabled/disabled (if requested)

setChecked(state)

Overrides the parent method to not actually change the check state if the widget is disabled AND we’re controlling the checkstate of disabled widgets. In that case, we only store the desired state for when the widget is re-enabled.

forceSetChecked(state)

Change the checkstate of the widget even if it is disabled and we are controlling the checkstate of disabled widgets. Also sets this state to be the state when the widget re-enabled

Parameters

state (bool) – Whether the checkbox should be checked

class schrodinger.ui.qt.swidgets.SCheckBoxToggle(*args, nocall=True, command=None, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SCheckBox

A QCheckBox that accepts the command callback for the toggled() signal as an argument, in comparison to SCheckBox that has command callback bound to clicked() signal.

__init__(*args, nocall=True, command=None, **kwargs)

Accepts all arguments normally given for a QCheckBox

Parameters
  • nocall (bool) – True if command should not be called during initialization, False otherwise

  • command (function) – function to call when the checkbox emits a ‘toggled()’ signal

class schrodinger.ui.qt.swidgets.SCheckBoxWithSubWidget(text, subwidget, *args, reverse_state=False, layout_type='horizontal', stretch=True, layout=None, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SCheckBoxToggle

This creates a checkbox that controls the enabled/disabled state of a subwidget. The subwidget can be a single widget or a combination widget such as a frame containing multiple widgets.

The default behavior is to enable the subwidget when the checkbox is checked and disable the widget when the checkbox is unchecked. This behavior can be reversed providing reverse_state=True to the constructor.

__init__(text, subwidget, *args, reverse_state=False, layout_type='horizontal', stretch=True, layout=None, **kwargs)

Create a SCheckBoxEdit instance.

Parameters
  • text (str) – The text label of the checkbox

  • subwidget (QWidget) – The widget whose enabled state should be controlled by the checkbox

  • reverse_state (bool) – Default behavior is to set the enabled state of the subwidget to the checked state of the checkbox. Set this parameter to True to set the enabled state of the subwidget to the opposite of the checked state of the checkbox.

  • layout_type (module constant HORIZONTAL or VERTICAL, or None) – The layout type for the checkbox and subwidget layout. Use None to avoid placing the checkbox and subwidget into a new layout.

  • stretch (bool) – Whether to add a stretch to the new layout after adding the widgets to it. The default is True if a sublayout is created.

  • layout (QLayout) – The layout to place the checkbox and subwidget in

Additional arguments can be taken from the SCheckBox class

setEnabled(state)

Set checkbox enabled/disabled state.

Parameters

state (bool) – the desired state of the checkbox

setVisible(state)

Set both the checkbox and subwidget visible

Parameters

state (bool) – The desired visible state of both the checkbox and subwidget

reset()

Reset all the widgets

class schrodinger.ui.qt.swidgets.SCheckBoxEdit(text, *args, checked=False, command=None, disabled_checkstate=None, layout=None, tip=None, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SCheckBox

A combined checkbox and line edit widget where the checkbox controls the enabled/disabled state of the edit. For use in cases where you want:

[x] some text ______ more text

where [x] is the checkbox and ______ is the line edit and the line edit should be disabled when the checkbox is unchecked.

The parent widget of this widget is the SCheckBox. The widget also contains an SLabeledEdit in the self.edit property and the layout containing both in the self.mylayout property. You can place the widget directly in a layout at creation using the layout keyword argument, or later but adding the .mylayout property to an existing layout.

Attribute requests will be fulfilled by the SCheckBox class first, and then the SLabeledEdit next. Thus, accessing self.isEnabled() will give the enabled state of the checkbox. Accessing self.validator() will give the validator set on the edit. To access an attribute on the edit where the checkbox has an attribute of the same name, you can always use self.edit.attribute.

The exceptions to the attribute hierarchy are the text and setText methods. These give the text and setText methods of the edit, because that is overwhelmingly going to be the widget of interest for those methods. To access the checkbox methods, use checkBoxText and setCheckBoxText methods.

The class constructor can be given keywords for either the SCheckBox or SLabeledEdit class. They will be passed to the proper class.

Note: The first label of the SLabeledEdit is hidden by default, so the ‘some text’ to the edit in the example above should be set as the checkbox label.

__init__(text, *args, checked=False, command=None, disabled_checkstate=None, layout=None, tip=None, **kwargs)

Create a SCheckBoxEdit instance.

Keyword arguments can be taken from the SCheckBox, SLineEdit or SLabeledEdit classes.

text()

Override the checkbox method to get the text from the edit instead. Use checkBoxText to get the checkbox text.

Return type

str

Returns

The text contained in the edit

setText(text)

Override the checkbox method to set the text in the edit instead. Use setCeckBoxText to get the checkbox text.

Parameters

text (str) – The new text for the edit

checkBoxText()

Get the current text of the checkbox label

Return type

str

Returns

The text of the checkbox label

setCheckBoxText(text)

Set the text of the checkbox label

Parameters

text (str) – The new text for the label

reset()

Reset all the widgets

setEnabled(state)

Set both the checkbox and line edit enabled/disabled

Parameters

state (bool) – The desired enabled state of both the checkbox and edit

setVisible(state)

Set both the checkbox and line edit visible/invisible

Parameters

state (bool) – The desired visible state of both the checkbox and edit

static getValuesFromStr(str_in)

Helper function for converting from string to bool and text.

Parameters

str_in (str) – String describing state of the widget

Return type

(bool, str)

Returns

Bool is True if checkbox is checked, otherwise - False. Str is edit text value.

af2SettingsGetValue()

This function adds support for the settings mixin. It allows to save checked item states and text in case this combo box is included in a settings panel.

Returns

String of the form: ‘0_text’, where first number can be 0 or 1 (for the checkbox), ‘text’ is where text from edit goes.

Return type

str

af2SettingsSetValue(str_in)

This function adds support for the settings mixin. It allows to set combo box check states and edit text when this widget is included in a settings panel.

Parameters

str_in (str) – String of the form: ‘0_text’, where first number can be 0 or 1 (for the checkbox), ‘text’ is where text from edit goes.

class schrodinger.ui.qt.swidgets.SRadioButton(*args, command=None, layout=None, checked=False, group=None, tip=None, **kwargs)

Bases: PyQt6.QtWidgets.QRadioButton

A QRadioButton that accepts the command callback for the clicked() signal as an argument

__init__(*args, command=None, layout=None, checked=False, group=None, tip=None, **kwargs)

Accepts all arguments normally given for a QRadioButton

Parameters
  • command (function) – function to call when the radio button emits a ‘clicked()’ signal

  • layout (QLayout) – layout to place the RadioButton in

  • checked (bool) – True if checked to start with, False (default) if not

  • group (SRadioButtonGroup) – A radio button group to add this button to

  • tip (str) – The tooltip for this radiobutton

reset()

Reset the radiobutton to its initial state

class schrodinger.ui.qt.swidgets.SRadioButtonWithSubWidget(subwidget, *args, layout=None, layout_type='horizontal', stretch=True, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SRadioButton

This creates a radio button that controls the enabled/disabled state of a subwidget. The subwidget can be a single widget or a combination widget such as a frame containing multiple widgets.

__init__(subwidget, *args, layout=None, layout_type='horizontal', stretch=True, **kwargs)
Parameters
  • subwidget (QWidget) – the widget whose enabled state should be controlled by the radio button

  • layout (QLayout or None) – the layout to put this widget in if there is one

  • layout_type (str) – the layout type for the radio button and subwidget, module constant HORIZONTAL or VERTICAL

  • stretch (bool) – whether to add a stretch to the new layout after adding the widgets to it

setEnabled(state)

Set enabled state.

Parameters

state (bool) – the desired state

setVisible(state)

Set visible state.

Parameters

state (bool) – the visible state

reset()

Reset.

class schrodinger.ui.qt.swidgets.SRadioButtonGroup(parent=None, labels=None, layout=None, command=None, command_clicked=None, nocall=False, default_index=0, tips=None, radio=True, keep_one_checked=False, subwidgets=None)

Bases: PyQt6.QtWidgets.QButtonGroup

A QButtonGroup that accepts the command callback for the buttonClicked() signal as an argument. Also accepts the texts of the radio buttons to create and puts them in the optionally supplied layout.

Button ID’s are the order in which the buttons are created.

__init__(parent=None, labels=None, layout=None, command=None, command_clicked=None, nocall=False, default_index=0, tips=None, radio=True, keep_one_checked=False, subwidgets=None)

Create a SRadioButtonGroup instance

Parameters
  • parent (QObject) – the parent object of this ButtonGroup

  • labels (list) – list of str, the items are the labels of the buttons to create. The ID of each button will be the index of its label in this list.

  • layout (QLayout) – If supplied, the buttons created will be added to this layout in the order they are created.

  • command (python callable) – The callback for each button’s toggled(bool) signal

  • command_clicked (python callable) – The callback for each button’s buttonClicked signal

  • nocall (bool) – False if the command parameter should be run when setting the default button checked during initialization, True if not

  • default_index (int) – The button ID (index in the labels list) of the button that should be set checked during initialization. If using checkboxes and no checkbox should be checked, use None.

  • tips (list) – list of str, the items are tooltips for each button created by the labels list. Must be the same length and in the same order as labels.

  • radio (bool) – Type of the buttons to use in the group. If True, radio buttons are used, otherwise, checkbox buttons

  • keep_one_checked (bool) – Only applies if radio=False so that checkboxes are used. If True, as least one checkbox will be enforced checked at all times. If the user unchecks the only checked box, it will immediately be re-checked. Note that any signals that emit when a button changes state will emit when the button is unchecked and then immediately emit again when the button is re-checked.

  • subwidgets (dict or None) – if a dict then keys are labels and values are instances of SubWidget

enforceOneChecked(button, state)

Ensure that at least one checkbox is checked. If none are checked the toggled checkbox will be set back to checked.

Parameters
  • button (QCheckBox) – The button that was toggled and resulted in this slot being called

  • state – The current state of the checkbox after toggling.

allCheckedText()

Get the text of all the checked boxes. In the case of exclusive radiobuttons, the list will be one item long.

Return type

list of str

Returns

Each item is label of a checked box

addButton(text, connect=True, tip=None, subwidget=None)

Create and add a new radio button to the group with the label text.

Parameters
  • text (str) – the label for the newly added button

  • connect (bool) – True if the button should have its toggled(bool) signal connected to the Group’s command property (default), False if not

  • tip (str) – The tooltip for the button

  • subwidget (SubWidget or None) – the SubWidget whose enabled state should be controlled by the button

Return type

int

Returns

the ID of the new button

addExistingButton(button, connect=True)

Add an existing radio button to the group. The button is not placed in the GroupBox layout.

Parameters
  • button (QRadioButton) – The button to add to the group

  • connect (bool) – True if the button should have its toggled(bool) signal and buttonClicked signal connected to the Group’s command and command_clicked property respectively, False if not

Return type

int

Returns

the ID of the new button

removeButton(button)

Remove the button from this group

Parameters

button (QAbstractButton) – The button to remove

setTextChecked(text)

Check the button with the given text

Parameters

text (str) – The text of the button to set checked

Raises

ValueError – If no such button exists

checkedText()

Return the text of the checked button

Return type

str

Returns

the text of the checked button

isChecked(text=None, id=0)

Return whether the specified button is checked or not. The button can (must) be specified by either its text label or ID.

Parameters
  • text (str) – the label of the button to check

  • id (int) – the ID of the button to check

Return type

bool

Returns

True if the specified button is checked, False if not

getButtonByText(text)

Returns the button with the given text

Parameters

text (str) – The label of the desired button

Return type

QRadioButton or None

Returns

The button with the label text, or None if no such button is found

reset()

Check the default radio button

setEnabled(state)

Set all child buttons to enabled state of state

Parameters

state (bool) – True if buttons should be enabled, False if not

setVisible(state)

Set the visibility of all child buttons

Parameters

state (bool) – Whether the widgets should be visible

setExclusive(state, uncheckable=False)

Uncheck all the buttons except the button clicked

Parameters
  • state (bool) – True if buttons should be exclusive and uncheckable. False if its not exclusive.

  • uncheckable (bool) – If true, when setExclusive is true it will allow to deselect the selected option. Won’t have any effect if setExclusive is False, since uncheckability is already allowed in that case. if False, the function behaves like the usual setExclusive function.

checkState(button)

Uncheck all the buttons except the button clicked

Parameters

button (QCheckBox or QRadioButton) – The button that was clicked

class schrodinger.ui.qt.swidgets.SLabeledRadioButtonGroup(group_label=None, layout_type='horizontal', layout=None, stretch=True, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SRadioButtonGroup

Convenience class for adding all SRadioButtonGroup buttons to a layout with an optional group label

__init__(group_label=None, layout_type='horizontal', layout=None, stretch=True, **kwargs)

Create an instance.

Parameters
  • group_label (str) – The label for the button group

  • layout_type (str) – Module constants VERTICAL or HORIZONTAL for the type of internal layout

  • layout (QLayout) – The layout to add the internal layout to

  • stretch (bool) – Whether to add a stretch after the last button

setEnabled(state)

Set the enabled state of radio buttons and group label

Parameters

state (bool) – Whether the widgets should be enabled

setVisible(state)

Set the visibility of all child buttons and group label

Parameters

state (bool) – Whether the widgets should be visible

reset()

Reset radio buttons and group label

schrodinger.ui.qt.swidgets.set_layout_margins(layout, indent=False)

Sets all layout margins to be 0, with the possible exception of indenting the left margin.

Parameters
  • layout (QBoxLayout) – The layout to set the margins on

  • indent (bool or int) – False for a 0 left margin, True for a STANDARD_INDENT left margin, or an int for the value of the left margin

class schrodinger.ui.qt.swidgets.SHBoxLayout(*args, indent=False, layout=None, **kwargs)

Bases: PyQt6.QtWidgets.QHBoxLayout

A QHBoxLayout with the proper margins for Schrodinger layouts.

__init__(*args, indent=False, layout=None, **kwargs)

Accepts all arguments normally given for a QHBoxLayout

Parameters
  • indent (bool or int) – False for a 0 left margin, True for a STANDARD_INDENT left margin, or an int for the value of the left margin - False by default.

  • layout (QBoxLayout) – The layout this layout should be placed in

class schrodinger.ui.qt.swidgets.SVBoxLayout(*args, indent=False, layout=None, **kwargs)

Bases: PyQt6.QtWidgets.QVBoxLayout

A QVBoxLayout with the proper margins for Schrodinger layouts.

__init__(*args, indent=False, layout=None, **kwargs)

Accepts all arguments normally given for a QVBoxLayout

Parameters
  • indent (bool or int) – False for a 0 left margin, True for a STANDARD_INDENT left margin, or an int for the value of the left margin - False by default.

  • layout (QBoxLayout) – The layout this layout should be placed in

class schrodinger.ui.qt.swidgets.SGridLayout(*args, indent=False, layout=None, **kwargs)

Bases: PyQt6.QtWidgets.QGridLayout

A QGridLayout with the proper margins for Schrodinger layouts

__init__(*args, indent=False, layout=None, **kwargs)

Accepts all arguments normally given for a QGridLayout

Parameters
  • indent (bool or int) – False for a 0 left margin, True for a STANDARD_INDENT left margin, or an int for the value of the left margin - False by default.

  • layout (QBoxLayout) – The layout this layout should be placed in

class schrodinger.ui.qt.swidgets.SGroupBox(*args, layout=None, parent_layout=None, checkable=False, checked=True, tip=None, flat=False, command=None, toggled_command=None, **kwargs)

Bases: PyQt6.QtWidgets.QGroupBox

A QGroupBox that includes a layout with the proper margins and spacing for Schrodinger layouts. By default, this is a vertical layout.

__init__(*args, layout=None, parent_layout=None, checkable=False, checked=True, tip=None, flat=False, command=None, toggled_command=None, **kwargs)

Accepts all arguments normally given for a QGroupBox

Parameters
  • layout (string) – Module constants VERTICAL, HORIZONTAL or GRID, for the type of internal layout

  • parent_layout (QBoxLayout) – The layout to place this SGroupBox into

  • checkable (bool) – Whether the groupbox is checkable, False by default

  • checked (bool) – Whether the groupbox should be checked if checkable. Default is True for checkable groupboxes.

  • tip (str) – The tooltip to apply to the group box

  • flat (bool) – whether to apply FlatStyle

  • command (function) – function to call when the checkbox emits a ‘clicked()’ signal

  • toggled_command (function) – function to call when the checkbox emits a ‘toggled()’ signal

reset()

Reset the GroupBox to the default check state if checkable

class schrodinger.ui.qt.swidgets.SNoCommaMinMaxMixin

Bases: object

This is a mixin class to bound value to top and bottom. It validates the absence of comma in the input. Further, it will validate whether the value is in between min and max.

Custom Validation classes can inherit from this class first, then the base Validator class. i.e. class MyValidator(SNoCommaMinMaxMixin, QtGui.QIntValidator):

minMaxValidate(value, pos, datatype=<class 'float'>, bottom=-inf, top=inf)

Method is a validator

Parameters
  • value (int or float) – any int or float data to be validated

  • pos (int) – position of the cursor

  • datatype (type) – datatype of value, Default is float

  • bottom (int or float) – minimum value

  • top (int or float) – maximum value

Return type

tuple

Returns

tuple of QtValidator definition of valid, value and pos. See PyQt QValidator documentation for definition of valid.

class schrodinger.ui.qt.swidgets.EnforcingValidatorMixin

Bases: object

This is a mixin class to be added to a QValidator subclass. It tracks the last valid value for a QLineEdit and can restore it when asked. Adding this mixin to a QValidator subclass will automatically enable it to work with the SLineEdit class “always_valid” parameter.

Custom Validation classes should inherit from this class first, then the base Validator class. i.e. class MyValidator(EnforcingValidatorMixin, QtGui.QIntValidator):

If a custom class overwrites the validate method, that method must store valid strings in self.last_valid_value before returning self.Acceptable.

restoreLastValidValue(edit)

Restores edit to the last valid value validated by this Validator

Parameters

edit (QLineEdit) – The QLineEdit to restore the value to

validate(*args)

Validate, and store the current value if it is valid

See PyQt documentation for argument and return value documentation.

If a custom class overwrites the validate method, that method must store valid strings in self.last_valid_value before returning self.Acceptable.

class schrodinger.ui.qt.swidgets.FileBaseNameValidator(*args, **kwargs)

Bases: schrodinger.ui.qt.swidgets.EnforcingValidatorMixin, PyQt6.QtGui.QValidator

Manage a file base name validator.

__init__(*args, **kwargs)
validate(value, position)

See PyQt documentation for arguments and return values.

class schrodinger.ui.qt.swidgets.SAsciiOnlyValidator

Bases: PyQt6.QtGui.QValidator

Ensures that the line edit contains only ASCII characters

validate(value, position)

Do not accept strings that can’t be converted to type ‘str’

See PyQt documentation for argument and return value documentation.

class schrodinger.ui.qt.swidgets.SASLValidator

Bases: PyQt6.QtGui.QValidator

Ensures that the line edit contains valid ASL

validate(value, position)

Mark not valid ASL strings as intermediate.

class schrodinger.ui.qt.swidgets.SNonEmptyStringValidator(parent=None)

Bases: schrodinger.ui.qt.swidgets.EnforcingValidatorMixin, PyQt6.QtGui.QValidator

A QValidator that ensures that only accepts non-empty strings and can enforce validity if the validated widget loses focus and is empty. Unicode characters are not accepted.

__init__(parent=None)

Create an SNonEmptyStringValidator object

Parameters
  • parent (QObject) – the object that owns the validator

  • bottom (float) – the least positive/most negative number accepted

  • top (float) – the most positive/least negative number accepted. If top=None, then there is no limit at the top end of the scale.

validate(value, position)

We only want to accept non-empty strings. Empty strings are considered Intermediate as this allows the edit to be cleared.

See PyQt documentation for argument and return value documentation.

class schrodinger.ui.qt.swidgets.SNoCommaDoubleValidator

Bases: schrodinger.ui.qt.swidgets.SNoCommaMinMaxMixin, PyQt6.QtGui.QDoubleValidator

A double validator that does not accept comma, which is used and accepted as a group separator in QDoubleValidator.

validate(self, a0: str, a1: int) Tuple[QValidator.State, str, int]
class schrodinger.ui.qt.swidgets.SRealValidator(parent=None, bottom=None, top=None, decimals=None)

Bases: schrodinger.ui.qt.swidgets.EnforcingValidatorMixin, schrodinger.ui.qt.swidgets.SNoCommaDoubleValidator

A QValidator that only accepts real numbers and can enforce validity if the validated widget loses focus and does not have valid text.

__init__(parent=None, bottom=None, top=None, decimals=None)
Parameters
  • parent (QObject) – the object that owns the validator

  • bottom (float) – the least positive/most negative number accepted

  • top (float) – the most positive/least negative number accepted. If top=None, then there is no limit at the top end of the scale.

  • decimals (int) – Maximum number of digits after the deciaml point. If decimals is None, default decimals from QDoubleValidator (1000) is used.

class schrodinger.ui.qt.swidgets.SNonNegativeRealValidator(parent=None, bottom=0.0, top=None, decimals=None)

Bases: schrodinger.ui.qt.swidgets.SRealValidator

A QValidator that only accepts non-negative (0.0 to +infinity) real numbers and can enforce validity if the validated widget loses focus and does not have valid text.

__init__(parent=None, bottom=0.0, top=None, decimals=None)
Parameters
  • parent (QObject) – the object that owns the validator

  • bottom (float) – the least positive/most negative number accepted

  • top (float) – the most positive/least negative number accepted. If top=None, then there is no limit at the top end of the scale.

  • decimals (int) – Maximum number of digits after the decimal point. If decimals is None, default decimals from QDoubleValidator (1000) is used.

class schrodinger.ui.qt.swidgets.SNoCommaIntValidator

Bases: schrodinger.ui.qt.swidgets.SNoCommaMinMaxMixin, PyQt6.QtGui.QIntValidator

An int validator that does not accept comma, which is used and accepted as a group separator in QIntValidator.

validate(self, a0: str, a1: int) Tuple[QValidator.State, str, int]
class schrodinger.ui.qt.swidgets.SNonNegativeIntValidator(parent=None, bottom=0, top=None)

Bases: schrodinger.ui.qt.swidgets.EnforcingValidatorMixin, schrodinger.ui.qt.swidgets.SNoCommaIntValidator

A QValidator that only accepts non-negative (0 to +infinity) int numbers and can enforce validity if the validated widget loses focus and does not have valid text.

__init__(parent=None, bottom=0, top=None)
Parameters
  • parent (QObject) – the object that owns the validator

  • bottom (int) – the least positive/most negative number accepted

  • top (int) – the most positive/least negative number accepted. If top=None, then there is no limit at the top end of the scale.

class schrodinger.ui.qt.swidgets.SNumberListValidator(parent=None, delimiter=None, number_type=<class 'int'>, bottom=0)

Bases: schrodinger.ui.qt.swidgets.EnforcingValidatorMixin, PyQt6.QtGui.QValidator

A Validator that only accepts a list of numbers (int or floats) with a delimiter. Minimum accepted number can be defined in ‘bottom’ parameter.

__init__(parent=None, delimiter=None, number_type=<class 'int'>, bottom=0)

Create a SNumberListValidator object.

Parameters
  • delimiter (str) – The delimiter for the list of numbers. If not given, any whitespace is considered a delimiter

  • number_type (type (int or float allowed)) – Type to convert to, int or float

  • bottom (int or float) – the least positive/most negative number accepted

See parent class for additional documentation

validate(value, position)

Only accept a list of comma-delimited positive integers

See PyQt documentation for argument and return value documentation.

class schrodinger.ui.qt.swidgets.SPosIntListValidator(parent=None, delimiter=None)

Bases: schrodinger.ui.qt.swidgets.SNumberListValidator

A Validator that only accepts a list of positive ints with a delimiter.

__init__(parent=None, delimiter=None)

Create a PosIntListValidator object

Parameters

delimiter (str) – The delimitor for the list of ints. If not given, any whitespace is considered a delimiter

See parent class for additional documentation

class schrodinger.ui.qt.swidgets.SRegularExpressionValidator(regexp: PyQt6.QtCore.QRegularExpression, parent: PyQt6.QtCore.QObject = None)

Bases: schrodinger.ui.qt.swidgets.EnforcingValidatorMixin, PyQt6.QtGui.QRegularExpressionValidator

A validator that only accepts strings that match the regexp.

__init__(regexp: PyQt6.QtCore.QRegularExpression, parent: PyQt6.QtCore.QObject = None)

Create an SRegularExpressionValidator object.

Parameters
  • regexp – Regular expression to validate

  • parent – the object that owns the validator

class schrodinger.ui.qt.swidgets.SComboBox(parent=None, items=None, default_item='', default_index=0, command=None, nocall=False, layout=None, tip='', itemdict=None, adjust_to_contents=True, min_width=None)

Bases: PyQt6.QtWidgets.QComboBox

A QComboBox widget with several Pythonic enhancements. It can also set its items and select a default value at creation time; and can be easily reset to its default value via reset.

A slot can be specified that will be hooked up with the currentIndexChanged[str] signal. This command will be called when the default value is set unless nocall=True

Action items can be added via the addAction() method. These items are not selectable. When one is chosen, its callback is executed and previously selected item is re-selected.

currentIndexChanged

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(parent=None, items=None, default_item='', default_index=0, command=None, nocall=False, layout=None, tip='', itemdict=None, adjust_to_contents=True, min_width=None)

Create an SComboBox object.

Parameters
  • parent (QWidget) – The parent widget of this SComboBox

  • items (list) – list of items (str) to be added to the ComboBox - see also itemdict.

  • default_item (str) – text of the item to select initially and upon reset

  • default_index (int) – the index of the item to select initially and upon reset. default_item overrides this parameter.

  • command (callable) – The slot to connect to the currentIndexChanged[str] signal. This command will be called when the default item is selected during initialization unless nocall=True.

  • nocall (bool) – True if command should not be called during initialization, False otherwise

  • layout (QLayout) – The layout to place this widget in

  • tip (str) – The tooltip for the combo

  • itemdict (collections.OrderedDict) – An OrderedDictionary with ComboBox items as keys and data as values. The data for the current ComboBox item is returned by the currentData method. If both items and itemdict are given, items are added first.

  • adjust_to_contents (bool) – True if the size adjust policy should be set to “Adjust to contents”

  • min_width (int) – this property holds the minimum number of characters that should fit into the combobox

addItemsFromDict(items)

Add items to the combo box from a dictionary of {text: user_data}. Note that setting the order of elements requires a collections.OrderedDict

Parameters

items (dict) – A dictionary of {text: user_data} to add to the combo box

currentData(role=ItemDataRole.UserRole)

Get the user data for the currently selected item

Parameters

role (int) – The role to retrieve data for

Returns

The user data

setCurrentData(data, role=ItemDataRole.UserRole)

Select the index with the specified user data

Parameters
  • text – The user data to select

  • role (int) – The role to search

Raises

ValueError – If the specified data is not found in the combo box

findData(data, role=ItemDataRole.UserRole)

Get the index of the item containing the specified data. Comparisons are done in Python rather than in C++ (as they are in QComboBox.findData) so that Python types without a direct C++ mapping can be compared correctly. See qt_utils.combo_find_data_py for additional documentation.

Parameters
  • data (object) – The data to search for

  • role (Qt.ItemDataRole) – The role to search

findDataPy(data, role=ItemDataRole.UserRole)

Get the index of the item containing the specified data. Similar to findData, but a ValueError will be raised if the specified data cannot be found. (findData mimics the QComboBox.findData behavior and returns a -1 in that scenario.)

See findData documentation for parameter documentation.

reset()

Reset the current ComboBox item to the default item.

setCurrentText(text)

Set the combobox to the item with the supplied text

Parameters

text (str) – The text of the item to make the current item

Raise

ValueError if no item with text exists

addItem(*args, **kwargs)

Add given items and emit signals as needed.

addItems(*args, **kwargs)

Add given items and emit signals as needed.

addAction(text, callback)

Add an “action” menu item. When selected by the user, it will invoke the callback and re-select the previously selected item.

setCurrentIndex(self, index: int)
keyPressEvent(event)

Ignore Up/Down key press events if any action items are present. In the future, consider re-implementing these handlers; it’s a non- trivial task. See http://code.metager.de/source/xref/lib/qt/src/gui/widgets/qcombobox.cpp#2931

items()

Return the current list of items in the combo box.

Return type

list

Returns

the current list of items

enableItems(texts=None, enable=True)

Enable/disable item in combo box based on texts :param list texts: list of item text to be enabled or disabled :param bool enable: Enable or disable item

enableAllItems(enable=True)

Enable/disable all item in combobox

Parameters

enable (bool) – Enable or disable item

removeItemByText(text)

Removes the item with the given text

Parameters

text (str) – the text of the item to be removed

Return type

bool

Returns

True if an item was removed, False otherwise

class schrodinger.ui.qt.swidgets.SLabeledComboBox(text, side='left', stretch=True, after_label='', layout=None, tip='', **kwargs)

Bases: schrodinger.ui.qt.swidgets.SComboBox

An SComboBox that has a label attached to it.

A SLabeledComboBox instance has a .label property that is an SLabel widget. The SLabeledComboBox instance also has a .mylayout property that the label and ComboBox are placed into. This .mylayout should be added to another layout in order to place the widgets into the GUI if the layout= keyword is not used during construction.

__init__(text, side='left', stretch=True, after_label='', layout=None, tip='', **kwargs)

Create a SLabledComboBox instance

Parameters
  • text (str) – The text of the label

  • side (str) – ‘left’ if the label should appear to the left of the ComboBox (default), or ‘top’ if the label should appear above it

  • stretch (bool) – Whether to put a stretch after the ComboBox (or after the after_label). Default is True, even if side=’top’.

  • after_label (str) – Label text to put after the ComboBox - default is None

  • layout (QLayout) – layout to place the LabeledEdit in

  • tip (str) – The tooltip for the labels and combobox

mylayout

Place this layout into the parent GUI, not the ComboBox

reset()

Reset the labels and ComboBox to their default values

setEnabled(state)

Set all child widgets to enabled state of state

Parameters

state (bool) – True if widgets should be enabled, False if not

setVisible(state)

Set all child widgets to visible state of state

Parameters

state (bool) – True if widgets should be visible, False if not

class schrodinger.ui.qt.swidgets.ActionComboBox(parent, text='')

Bases: PyQt6.QtWidgets.QComboBox

A combo box with a few notable changes:

  1. “action” signal is emitted when a new item is selected, and callback is called when one is provided for the selected menu.

  2. The label of the combo box never changes - there is no concept of a currently selected item.

  3. The label of the combo box is not shown in the pop-up menu.

For custom behavior (e.g. disabling items), use the ActionComboBox.menu attribute to get the QMenu object.

Parameters

itemSelected (PyQt5.QtCore.pyqtSignal) – signal emitted when a menu item is selected. The only argument is the text of the selected item.

itemSelected

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(parent, text='')
Parameters
  • text – Text/label to show in the combo menu. This is what the user sees until they click on the widget.

  • text – str

addItem(text, callback=None)

Add a menu item with the given action callback. When this item is selected, the specified callback will be called in addition to emitting the itemSelected signal.

addAction(self, action: QAction)
addSeparator()
count(self) int
setText(combo_txt)

Sets texts that will be shown in combo box label widget.

Parama combo_txt

combo box default text

reset()
showPopup(self)
actionTriggered(action)

This function is called when item is selected in the popup.

Parameters

item_index (int) – Index (position) of the selected menu item.

class schrodinger.ui.qt.swidgets.ActionPushButton(*args, **kwargs)

Bases: PyQt6.QtWidgets.QPushButton

A push button that pops-up a menu when clicked. Similar to ActionComboBox except that there is no concept of selection / current item.

icon = '/scr/buildbot/savedbuilds/2024-2/NB/build-134/internal/lib/python3.11/site-packages/schrodinger/ui/qt/pushbutton-menu-arrow.png'
platform_specific = 'width: 13px;'
STYLE_SHEET = '\n    QPushButton::menu-indicator {\n        image: url("/scr/buildbot/savedbuilds/2024-2/NB/build-134/internal/lib/python3.11/site-packages/schrodinger/ui/qt/pushbutton-menu-arrow.png");\n        subcontrol-position: center right;\n        subcontrol-origin: padding;\n        width: 13px;\n    }\n    '
__init__(*args, **kwargs)
addItem(text, function)
addAction(self, action: QAction)
addSeparator()
class schrodinger.ui.qt.swidgets.MinMaxSpinBoxTether(minbox, maxbox, parent=None, delta=0)

Bases: PyQt6.QtCore.QObject

A QObject that ties two spinboxes together and ensures that the max spinbox never has a value less than the min spinbox. This restriction is enforced when one of the spinbox changes by changing the value of the other spinbox if necessary.

__init__(minbox, maxbox, parent=None, delta=0)

Create a MinMaxSpinboxTether object

Parameters
  • minbox (QSpinBox) – The spinbox controlling the minimum value

  • maxbox (QSpinBox) – The spinbox controlling the maximum value

  • parent (QWidget) – The parent widget

  • delta (int or float) – The minimum value by which the two spinboxes must differ - i.e. a value of 1 means the minimum spinbox must always be at least 1 less than the maximum spinbox

minimumChanged(minval)

React to a change in the minimum value

Parameters

minval (int or float) – The new minimum value

maximumChanged(maxval)

React to a change in the maximum value

Parameters

maxval (int or float) – The new maximum value

class schrodinger.ui.qt.swidgets.SSpinBox(parent=None, minimum=None, maximum=None, value=None, layout=None, command=None, nocall=False, stepsize=None, width=None, tip=None)

Bases: PyQt6.QtWidgets.QSpinBox

A QSpinBox that can set it’s min, max and value in the constructor plus pack itself in a layout

__init__(parent=None, minimum=None, maximum=None, value=None, layout=None, command=None, nocall=False, stepsize=None, width=None, tip=None)

Create an SSpinBox object

Parameters
  • parent (QObject) – the parent object of this SSpinBox

  • minimum (int) – The minimum value of this SSpinBox

  • maximum (int) – The maximum value of this SSpinBox

  • value (int) – The initial value of this SSpinBox. This value will also be used as the default value by the reset method.

  • layout (QLayout) – If supplied, the SSpinBox created will be added to this layout

  • command (python callable) – The callback for the valueChanged signal. This command will not be called during initialization unless nocall is set to False.

  • nocall (bool) – True if the callback command should not be called during initialization, False (default) if the command should be called.

  • stepsize (int) – The stepsize each arrow click changes the value by

  • width (int) – The maximum width of the spinbox

  • tip (str) – The tooltip

reset()

Reset the spin box to its default value

class schrodinger.ui.qt.swidgets.SDoubleSpinBox(parent=None, minimum=None, maximum=None, value=None, layout=None, command=None, nocall=False, stepsize=None, decimals=None, width=None, tip=None)

Bases: PyQt6.QtWidgets.QDoubleSpinBox

A QDoubleSpinBox that can set it’s min, max and value in the constructor plus pack itself in a layout

__init__(parent=None, minimum=None, maximum=None, value=None, layout=None, command=None, nocall=False, stepsize=None, decimals=None, width=None, tip=None)

Create an SDoubleSpinBox object

Parameters
  • parent (QObject) – the parent object of this SDoubleSpinBox

  • minimum (float) – The minimum value of this SDoubleSpinBox

  • maximum (float) – The maximum value of this SDoubleSpinBox

  • value (float) – The initial value of this SDoubleSpinBox. This value will also be used as the default value by the reset method.

  • stepsize (float) – The stepsize each arrow click changes the value by

  • decimals (int) – Number of decimal places to display

  • layout (QLayout) – If supplied, the SDoubleSpinBox created will be added to this layout

  • command (python callable) – The callback for the valueChanged signal. This command will be called during initialization unless nocall is set to True.

  • nocall (bool) – True if the callback command should not be called during initialization, False (default) if the command should be called.

  • width (int) – The maximum width of the spinbox

  • tip (str) – The tooltip

reset()

Reset the spin box to its default value

class schrodinger.ui.qt.swidgets.SLabeledDoubleSpinBox(text, side='left', stretch=True, after_label='', layout=None, tip=None, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SDoubleSpinBox

An SDoubleSpinBox that has a label attached to it.

A SLabledDoubleSpinBox instance has a .label property that is an SLabel widget. The SLabeledComboBox instance also has a .mylayout property that the label and SDoubleSpinBox are placed into. This .mylayout should be added to another layout in order to place the widgets into the GUI if the layout= keyword is not used during construction.

__init__(text, side='left', stretch=True, after_label='', layout=None, tip=None, **kwargs)

Create a SLabledDoubleSpinBox instance

Parameters
  • text (str) – The text of the label

  • side (str) – ‘left’ if the label should appear to the left of the SDoubleSpinBox (default), or ‘top’ if the label should appear above it

  • stretch (bool) – Whether to put a stretch after the SDoubleSpinBox (or after the after_label). Default is True, even if side=’top’.

  • after_label (str) – Label text to put after the SDoubleSpinBox - default is None

  • layout (QLayout) – If supplied, the SDoubleSpinBox created will be added to this layout

  • tip (str) – The tooltip to apply to the labels and spinbox

mylayout

Place this layout into the parent GUI, not the ComboBox

reset()

Reset the labels and ComboBox to their default values

setEnabled(state)

Set all child widgets to enabled state of state

Parameters

state (bool) – True if widgets should be enabled, False if not

setVisible(state)

Set all child widgets to visible state of state

Parameters

state (bool) – True if widgets should be visible, False if not

class schrodinger.ui.qt.swidgets.SLabeledSpinBox(text, side='left', stretch=True, after_label='', layout=None, tip='', **kwargs)

Bases: schrodinger.ui.qt.swidgets.SSpinBox

An SSpinBox that has a label attached to it.

A SLabledSpinBox instance has a .label property that is an SLabel widget. The SLabeledSpinBox instance also has a .mylayout property that the label and SSpinBox are placed into. This .mylayout should be added to another layout in order to place the widgets into the GUI if the layout= keyword is not used during construction.

__init__(text, side='left', stretch=True, after_label='', layout=None, tip='', **kwargs)

Create a SLabledSpinBox instance

Parameters
  • text (str) – The text of the label

  • side (str) – ‘left’ if the label should appear to the left of the SSpinBox (default), or ‘top’ if the label should appear above it

  • stretch (bool) – Whether to put a stretch after the SSpinBox (or after the after_label). Default is True, even if side=’top’.

  • after_label (str) – Label text to put after the SSpinBox - default is None

  • layout (QLayout) – If supplied, the SSpinBox created will be added to this layout

  • tip (str) – The tooltip to apply to the labels and edit

mylayout

Place this layout into the parent GUI, not the ComboBox

reset()

Reset the labels and ComboBox to their default values

setEnabled(state)

Set all child widgets to enabled state of state

Parameters

state (bool) – True if widgets should be enabled, False if not

setVisible(state)

Set all child widgets to visible state of state

Parameters

state (bool) – True if widgets should be visible, False if not

setToolTip(tip)

Set the tooltip for this widget

Parameters

tip (str) – The tooltip to apply to the labels and spinbox

class schrodinger.ui.qt.swidgets.SListWidget(parent=None, items=None, command=None, nocall=False, layout=None, emit='row', mode='single', drag=False, selection_command=None)

Bases: PyQt6.QtWidgets.QListWidget

A QListWidget that can set its items and set up a callback at creation.

__init__(parent=None, items=None, command=None, nocall=False, layout=None, emit='row', mode='single', drag=False, selection_command=None)
Parameters
  • parent (QObject) – the parent object of this SListWidget

  • items (list) – list of str, the items are the entries in the ListWidget.

  • command (python callable) – The callback for when the current item is changed signal. The callback may be triggered before selected command signal.

  • emit (str) – ‘row’ if the signal emitted should be ‘currentRowChanged(‘int’)’ or else the signal will be ‘currentTextChanged[str]. The default is ‘row’

  • mode (str or QAbstractItemView.SelectionMode) – The selection mode - either ‘single’, ‘extended’, or a SelectionMode enum. The default is ‘single’.

  • drag (bool) – True if items can be dragged around in the listwidget. Note that if using actual QListWidgetItems, those items must have ItemIsDragEnabled and ItemIsSelectable flags turned on

  • nocall (bool) – False if the command parameter should be run when filling the widget during initialization, True if not. The default is False

  • layout (QLayout) – If supplied, the ListWidget created will be added to this layout

  • selection_command (python callable) – The callback for whenever the selection changes

Note

Do not create a method named reset that calls self.clear() as that causes recursion errors. It’s probably best to avoid naming a method “reset” altogether as it appears to be some sort of private method of the class (that the public clear() method calls).

allItems()

Return all the items in the list widget in order, including hidden ones

Return type

list

Returns

list of all QListWidgetItems in the list widget in order

allItemsIter(role=ItemDataRole.UserRole)

Return a generator over text and data of the list widget, inspired by .items() method of dict.

Parameters

role (int) – User role to pass do .data function

Return type

generator(tuple(str, type))

Returns

Generator over tupple of text and data of the list widget

allText()

Return the list of all text values, including hidden items

Return type

list

Returns

List of strings

removeItem(item)

Removes and returns the given item

Parameters

item (QListWidgetItem or 0) – The item to be removed from the list widget or 0 if it is not found in the list widget

removeItemByText(text)

Removes and returns the item with the given text

Parameters

text (str) – the text of the item to be removed

Return type

QListWidgetItem or None

Returns

The removed item, or None if an item with the given text is not found.

removeSelectedItems()

Removes selected items.

setTextSelected(text, selected=True)

Selects the item with the given text. Will select hidden items too.

Parameters
  • text (str) – the text of the item to be selected

  • selected (bool) – True if the item should be selected, False if it should be deselected.

Return type

bool

Returns

True if an item with the given text is found, False if not

rowByText(text, match=MatchFlag.MatchExactly)

Returns the row that a given text is in. Also accounts for hidden items.

Parameters
  • text (str) – The text to find

  • match (Qt.MatchFlag) – Type of match to search for - default is exact

Return type

int or False

Returns

Row that holds matched text (can be 0), if text is not matched, returns False

selectedText()

Return the list of selected text values, including those of hidden items

Return type

list

Returns

List of strings, each member is the text of a selected item

class schrodinger.ui.qt.swidgets.SFilteredListWidget(label=None, filterlabel='Filter:', filter='within', filterside='bottom', case=False, layout=None, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SListWidget

An SListWidget with an additional line edit that can be used to filter the items within the ListWidget

The SFilteredListWidget instance has a .mylayout property that all the widgets are placed into. This .mylayout should be added to another layout in order to place the widgets into the GUI - if the widget is not placed into the GUI directly via the layout= keyword.

Items are set to hidden when they don’t match the filter. Selected items that are set to hidden are unselected. Since items are hidden instead of deleted, currentRow() and rowByText() return the true index of the item, not the index among visible items.

__init__(label=None, filterlabel='Filter:', filter='within', filterside='bottom', case=False, layout=None, **kwargs)

See the SListWidget documentation for additional keyword parameters.

Parameters
  • label (str) – the text that will appear directly above the list widget

  • filterlabel (str) – the label above the filter line edit.

  • filter (str) – One of ‘within’, ‘start’, ‘end’. If within (default), the filter will find any item that has the filter text anywhere within its text. ‘start’ will only check if the item text starts with the filter ext, ‘end’ will only check if the item text ends with.

  • filterside (str) – One of ‘top’ or ‘bottom’ (default) - the location of the filter edit relative to the list widget

  • case (bool) – True if filter is case sensitive, False if not

filterList(filtervalue)

Filter the items in the list widget according to the contents of the LineEdit and our filter rules

Parameters

filtervalue (str) – The current value to filter the ListWidget by

clear()

Removes all items from the ListWidget

withinFilter(text, filtertext)

Checks whether filtertext is contained within text - case insensitive

Parameters
  • text (str) – the text to check

  • filtertext (str) – will check for the existance of this text within text.

Return type

bool

Returns

True if filtertext is found within text, False if not

startFilter(text, filtertext)

Checks whether text starts with filtertext

Parameters
  • text (str) – the text to check

  • filtertext (str) – will check if text starts with filtertext.

Return type

bool

Returns

True if text starts with filtertext, False if not

endFilter(text, filtertext)

Checks whether text ends with filtertext

Parameters
  • text (str) – the text to check

  • filtertext (str) – will check if text ends with filtertext.

Return type

bool

Returns

True if text ends with filtertext, False if not

class schrodinger.ui.qt.swidgets.SFrame(parent=None, layout=None, layout_type='vertical', indent=False)

Bases: PyQt6.QtWidgets.QFrame

A Frame that can be placed in a layout and is given a layout when created

__init__(parent=None, layout=None, layout_type='vertical', indent=False)

Create an SFrame instance. The frame has a mylayout property that is the internal layout.

Parameters
  • parent (QObject) – the parent object of this SFrame

  • layout_type (string) – Module constants VERTICAL, HORIZONTAL, or GRID, for the type of internal layout

  • layout (QBoxLayout) – The layout to place this SFrame into

  • indent (bool or int) – False for a 0 left margin, True for a STANDARD_INDENT left margin, or an int for the value of the left margin - False by default.

addWidget(widget)

Add widget to the frame layout.

Parameters

widget (QWidget) – Widget to place on the layout

addStretch()

Add stretch to the frame layout.

class schrodinger.ui.qt.swidgets.SHLine(layout=None)

Bases: PyQt6.QtWidgets.QFrame

A simple horizontal line

__init__(layout=None)

Create a SHLine object

Parameters

layout (QLayout) – If supplied, the line created will be added to this layout

class schrodinger.ui.qt.swidgets.STwoButtonBox(layout=None, accept_text='Accept', accept_command=None, close_text='Close', close_command=None)

Bases: PyQt6.QtWidgets.QWidget

A bottom button box that consists of a horizontal line over two buttons, an accept button on the left and a close button on the right.

__init__(layout=None, accept_text='Accept', accept_command=None, close_text='Close', close_command=None)

Create a SHLine object

Parameters
  • layout (QLayout) – If supplied, the line created will be added to this layout

  • accept_text (str) – The label on the accept button (“Accept” by default)

  • accept_command (callable) – The command the accept button should call. If this is not given or is None, the Accept button will not be created.

  • close_text (str) – The label on the close button (“Close” by default)

  • close_command (callable) – The command the close button should call. If this is not given or is None, the Close button will not be created.

class schrodinger.ui.qt.swidgets.SEmittingScrollBar

Bases: PyQt6.QtWidgets.QScrollBar

showEvent(self, a0: QShowEvent)
hideEvent(self, a0: QHideEvent)
schrodinger.ui.qt.swidgets.draw_picture_into_rect(painter, pic, rect, max_scale=None, padding_factor=None)

Draw a QPicture into a given rectangle.

Parameters
  • painter (QtGui.QPainter object) – QPainter object that will do the drawing into the cell.

  • pic (QPicture) – the picture to be drawn into the rectangle

  • rect (QRect) – the rectangle that defines the drawing region

  • max_scale (float or None) – The maximum amount to scale the picture while attempting to make it fit into rect. This value is multipled by the scale factor required to fit a 150(wide) x 100 (high) picture to fit that picture into rect. The resulting product (max_scale * reference picture scale) is the true maximum scale factor allowed.

Padding_factor

If set, add padding on all 4 sides of QPicture, on the dimensions of the rectangle, to avoid it from “touching” the outer edges of the paint area. For 2D structure images, value of 0.04 is recommended.

Returns

Rectangle that the QPicture was actually painted into. It’s a rectangle within rect - after removing padding on each side.

Return type

QRectF

class schrodinger.ui.qt.swidgets.SToolButton(*args, text='', layout=None, tip=None, command=None, **kwargs)

Bases: PyQt6.QtWidgets.QToolButton

Schrodinger-style QToolButton

__init__(*args, text='', layout=None, tip=None, command=None, **kwargs)

Create an SToolButton instance

Parameters
  • text (str) – The text of the button

  • layout (QtWidgets.QBoxLayout) – The layout for this button

  • tip (str) – The tooltip for this button

  • command (callable) – The command to connect the clicked signal to

class schrodinger.ui.qt.swidgets.EditButton(*args, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SToolButton

Edit button with custom Schrodinger icon.

__init__(*args, **kwargs)

Create an SToolButton instance

Parameters
  • text (str) – The text of the button

  • layout (QtWidgets.QBoxLayout) – The layout for this button

  • tip (str) – The tooltip for this button

  • command (callable) – The command to connect the clicked signal to

class schrodinger.ui.qt.swidgets.HelpButton(*args, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SToolButton

Help tool button that will show an ellipsis button on top when hovered. Clicking that or right clicking this button will launch a tutorial submenu.

Variables

tutorialRequested – Signal for requesting launching a tutorial, emitted when a tutorial is clicked. This emits the tutorial topic string required to launch the help dialog.

tutorialRequested

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(*args, **kwargs)

Set up the tool button and the ellipsis button on top.

setHelpTopic(help_topic: str)

Set the tutorial mapping for the menu using the given help topic. This map is used to populate the menu actions along with the tutorial ID.

Parameters

help_topic – panel specific help topic

emitTutorialSignal(action)

Emit the tutorial requested signal with the relevant tutorial type.

enterEvent(self, a0: QEnterEvent)
leaveEvent(self, a0: QEvent)
classmethod getTutorialsJsonMap() Optional[Dict[str, Dict[str, str]]]

Return the tutorials mapping for help topics from docs.

Returns

Dictionary mapping of help topics to tutorial help topics and descriptions.

class schrodinger.ui.qt.swidgets.EllipsisPopUpButton(parent)

Bases: schrodinger.ui.qt.swidgets.SToolButton

Variables

BUTTON_OFFSET (int) – Vertical overlap between the ellipsis button and the tool button

BUTTON_OFFSET = 5
__init__(parent)
Parameters

parent (HelpButton) – Toolbutton to show ellipsis button over

show()

Show the ellipsis button if neither it nor the popup widget are visible

leaveEvent(event)

Hide the ellipsis button on mouse leave if the mouse isn’t over the tool button

class schrodinger.ui.qt.swidgets.InfoButton(*args, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SToolButton

Info button, with custom Schrodinger icon. Typically the only purpose of such icon is to display tooltip text when clicked or hovered.

INFO_ICON = ':/schrodinger/ui/qt/icons_dir/info.png'
INFO_H_ICON = ':/schrodinger/ui/qt/icons_dir/info_h.png'
INFO_BUTTON_STYLESHEET = '\n    QToolButton {\n        border: none;\n        padding: 0px 0px 0px 0px;\n        image: url(:/schrodinger/ui/qt/icons_dir/info.png);\n    }\n    QToolButton:hover {\n        image: url(:/schrodinger/ui/qt/icons_dir/info_h.png);\n    }'
__init__(*args, **kwargs)

Create an SToolButton instance

Parameters
  • text (str) – The text of the button

  • layout (QtWidgets.QBoxLayout) – The layout for this button

  • tip (str) – The tooltip for this button

  • command (callable) – The command to connect the clicked signal to

class schrodinger.ui.qt.swidgets.ResetButton(*args, layout=None, tip='Reset All', command=None, **kwargs)

Bases: PyQt6.QtWidgets.QToolButton

Reset button, with custom Schrodinger icon.

__init__(*args, layout=None, tip='Reset All', command=None, **kwargs)
Parameters
  • layout (QLayout) – the layout that the widget created will be added to

  • tip (str) – the tooltip

  • command (callable) – Slot for the button click signal.

class schrodinger.ui.qt.swidgets.SaveButton(*args, layout=None, tip=None, command=None, **kwargs)

Bases: PyQt6.QtWidgets.QToolButton

Apply button with custom Schrodinger icon.

__init__(*args, layout=None, tip=None, command=None, **kwargs)
Parameters
  • layout (QLayout) – If supplied, the STableWidget created will be added to the layout.

  • tip (str) – the tooltip

  • command (callable) – Slot for the button click signal.

class schrodinger.ui.qt.swidgets.CloseButton(*args, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SToolButton

Close button with custom Schrodinger icon.

__init__(*args, **kwargs)

Create an SToolButton instance

Parameters
  • text (str) – The text of the button

  • layout (QtWidgets.QBoxLayout) – The layout for this button

  • tip (str) – The tooltip for this button

  • command (callable) – The command to connect the clicked signal to

class schrodinger.ui.qt.swidgets.TrashButton(*args, layout=None, tip=None, command=None, **kwargs)

Bases: PyQt6.QtWidgets.QToolButton

Trash button with custom Schrodinger icon.

__init__(*args, layout=None, tip=None, command=None, **kwargs)
Parameters
  • layout (QLayout) – ‘the layout that the widget created will be added to’

  • tip (str) – the tooltip

  • command (callable) – Slot for the button click signal.

Bases: PyQt6.QtWidgets.QLabel

A clickable label with text “Ligand Detection…” which opens the ligand detection Maestro preferences when clicked.

__init__(*args, **kwargs)
class schrodinger.ui.qt.swidgets.SDialog(master, user_accept_function=None, standard_buttons=None, nonstandard_buttons=None, help_topic='', title=None)

Bases: PyQt6.QtWidgets.QDialog

A Base Dialog class for easier Dialog creation

__init__(master, user_accept_function=None, standard_buttons=None, nonstandard_buttons=None, help_topic='', title=None)

Creat an SDialog object

Parameters
  • master (QWidget) – The parent of this dialog

  • user_accept_function (callable) – A function to call from a custom accept method implemented in a subclass

  • standard_buttons (list) – List of standard buttons to add - each item must be a QDialogButtonBox.StandardButton constant (i.e. QDialogButtonBox.Ok). The default if no standard buttons or non-standard buttons are provided is Ok and Cancel.

  • nonstandard_buttons (list of (QPushButton, QDialogButtonBox.ButtonRole) tuples) – Each item of the list is a tuple containing an existing button and a ButtonRole such as AcceptRole. The default if no standard buttons or non-standard buttons are provided is Ok and Cancel buttons.

  • help_topic (str) – The help topic for this panel. If the help topic is provided a help button will automatically be added to the panel.

  • title (str) – The dialog window title

layOut()

Lay out the custom widgets in this dialog.

giveHelp()

Display the help topic for this dialog

warning(msg)

Display a warning dialog with a message

Parameters

msg (str) – The message to display in the warning dialog

info(msg)

Display an information dialog with a message

Parameters

msg (str) – The message to display in the information dialog

error(msg)

Display an error dialog with a message

Parameters

msg (str) – The message to display in the error dialog

reset()

Reset the panel when the Reset button is pressed. Must be re-implemented in a subclass

question(msg, button1='OK', button2='Cancel')

Display a question dialog with a message Returns True if first button (default OK) is pressed, False otherwise.

Parameters
  • msg (str) – The message to display in the question dialog

  • button1 (str) – The text to display on first button

  • button2 (str) – The text to display on second button

class schrodinger.ui.qt.swidgets.NewNameDialog(parent, default_name, existing_names, overwrite_existing_names=True, validator=None, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SDialog

Dialog for getting a new name from the user

__init__(parent, default_name, existing_names, overwrite_existing_names=True, validator=None, **kwargs)

Create a NewNameDialog instance

Parameters
  • parent (QtWidgets.QWidget) – the parent widget

  • default_name (str) – The default name

  • existing_names (iterable) – The existing names

  • validator (QtGui.QValidator) – The validator to make sure the given name is acceptable. If None, then no validator is used.

  • overwrite_existing_names (bool) – Whether you want to allow the user to overwrite a name that already exists

layOut()

Layout the widgets

getName()

Return the name.

Return type

str

Returns

the name

accept()

Check that the name is valid before accepting.

Return type

None

Returns

None is always returned, if None is returned before the super then the result is not accepted

class schrodinger.ui.qt.swidgets.SMARTSEdit(master, tag=None, empty_ok=True, label='SMARTS:', indicator=True, indicator_state=0, indicator_tips=True, canvas_api=True, rdkit_api=False, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SLabeledEdit

A line edit for entering SMARTS strings with an icon that indicates the SMARTS’ validity

smarts_data_changed

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

invalid_smarts_changed

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(master, tag=None, empty_ok=True, label='SMARTS:', indicator=True, indicator_state=0, indicator_tips=True, canvas_api=True, rdkit_api=False, **kwargs)

Create a SMARTSEntry object

Parameters
  • master (QWidget) – Something with a warning method for displaying warning dialogs

  • tag (str) – A string that defines the edit for use in warning messages. ex. “No valid SMARTS pattern for ‘tag’”. If not supplied, a generic message will be used.

  • empty_ok (bool) – Whether an empty edit is considered VALID or INTERMEDIATE

  • label (str) – The label preceeding the QLineEdit

  • indicator (bool) – True if a valid/invalid indicator should be appended

  • indicator_state (bool) – The default state of the indicator (INDICATOR_VALID, INDICATOR_INVALID or INDICATOR_INTERMEDIATE)

  • indicator_tips (dict) – The tooltips for the different states of the indicator - see the SValidIndicator class for more information. If not provided, they can be given directly in the setIndicator call. If not given in either place, the indicator will have default tooltips. Pass in None to have no tooltips at all.

  • canvas_api (bool) – toggle whether to verify with analyze.validate_smarts or analyze.validate_smarts_canvas (defaults to validate_smarts_canvas)

  • rdkit_api (bool) – Whether to verify with adapter.validate_smarts. It cannot be used with canvas_api.

See the parent SLabeledEdit class for additional keyword arguments

setEmptyOK(is_ok)

Set whether an empty edit is considered VALID or INTERMEDIATE

Parameters

is_ok (bool) – Whether an empty edit is VALID

isInvalid()

Is the line edit currently colored as invalid?

Return type

bool

Returns

Whether the line edit has the invalid color

isValid()

Is the line edit currently colored as valid?

Return type

bool

Returns

Whether the line edit has the valid color

startedEditingSMARTS()

React to the SMARTS pattern changing but not yet finished

doneEditingSMARTS(force=False)

The SMARTS pattern is complete, so validate it if necessary

Parameters

force (bool) – Force the SMARTS pattern to be validated even if the existing state is invalid.

getSMARTSPatterns(raise_if_empty=False)

Get a list of the current SMARTS patterns specified by the user

Parameters

raise_if_empty (bool) – Whether to raise an error if the checkbox is checked but the line edit is empty

Return type

list

Returns

An empty list if the checkbox is not checked, or the contents of the edit converted via whitespace to a list of strings if the checkbox is checked.

Raises

ValueError – if raise_if_empty is True, the checkbox is checked, and the edit is empty

validateSMARTS(pattern)

Validate smarts pattern

Parameters

pattern (str) – The smarts pattern to validate

Return type

(bool, str)

Returns

The bool indicates whether the SMARTS pattern is valid, the string gives the error message if bool is False Note: the return value of this function always evaluates to True since it is a non-empty tuple.

findSMARTSError(verbose=True)

Find any error in the SMARTS patterns

Parameters

verbose (bool) – Whether to post a warning dialog with the error found

Return type

str

Returns

An empty string if no error is found, or an error message describing the error that was found

setText(text)

Overrides the parent method to also evaluate the new SMARTS string

clear()

Overrides the parent method to also evaluate the new SMARTS string

class schrodinger.ui.qt.swidgets.ColorWidget(parent_layout, text, default_rgb_color=(0, 0, 255), check_box_state=None, pixmap_size=16, stretch=True, use_maestro_colors=False, command=None, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SFrame

A QtWidgets.QFrame to manage a color widget.

color_changed

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(parent_layout, text, default_rgb_color=(0, 0, 255), check_box_state=None, pixmap_size=16, stretch=True, use_maestro_colors=False, command=None, **kwargs)

Create an instance.

Parameters
  • parent_layout (QtWidgets.QVBoxLayout) – the layout this widget belongs in

  • text (str) – the text for the widget

  • default_rgb_color (tuple) – a triple of integers in [0, 255] that give RGB colors

  • check_box_state (None or bool) – None indicates that the widget should not be behind a check box, the bool indicates that (1) the widget should be behind a check box and (2) that by default should be checked (True) or unchecked (False)

  • pixmap_size (int) – the size of the pixmap used for the coloring button

  • stretch (bool) – whether to add a stretch space after the color button

  • use_maestro_colors (bool) – whether to map selected rgb colors to nearby rgb colors that are also supported by color name, for example “spring green”, in Maestro (see names in mmshare/mmlibs/mmcolor/colors.res)

  • command (callable) – Slot for the color_changed signal, which is emitted when the button color changes. The command is not called when the button is created. command is called with a triple of integers in [0, 255] that give the new RGB colors.

mapToMaestroColor(rgb_color)

Map the given rgb color to a nearby rgb color that is also supported by color name, for example “spring green”, in Maestro.

Parameters

rgb_color (tuple) – a triple of integers in [0, 255] that give RGB colors

Type

tuple

Returns

a triple of integers in [0, 255] that give RGB colors for the color that is supported by name in Maestro

setButtonColor(rgb_color)

Set the button color.

Parameters

rgb_color (tuple) – a triple of integers in [0, 255] that give RGB colors

enableButtonViaCheckBox()

Enable/disable the color button via the checkbox state.

openColorSelector()

Open the color selector dialog.

reset()

Reset it.

class schrodinger.ui.qt.swidgets.STableView(*args, **kwargs)

Bases: PyQt6.QtWidgets.QTableView

Just like a QTableView except:

  1. LineEditDelegate is the default delegate. It draws “pencil” icons in cells that are editable.

  2. Cells whose delegates have MOUSE_CLICK_STARTS_EDIT set will enter the edit mode as soon as the user clicks (press & release) in the cell.

  3. Cells whose delegates have MOUSE_PRESS_STARTS_EDIT set will enter the edit mode as soon as the user presses the mouse button.

__init__(*args, **kwargs)

Create a STableView instance.

class schrodinger.ui.qt.swidgets.STableWidgetItem(editable=True, selectable=True, enabled=True, user_checkable=True, text='', vertical_align=AlignmentFlag.AlignVCenter, horizontal_align=AlignmentFlag.AlignHCenter)

Bases: PyQt6.QtWidgets.QTableWidgetItem

Table widget item with proper sorting of numbers

SELECT_ITEM = 1
ENABLE_ITEM = 32
EDITABLE_ITEM = 2
CHECKABLE_ITEM = 16
TOP = 32
VCENTER = 128
BOTTOM = 256
VERTICAL_ALIGNS = {AlignmentFlag.AlignTop, AlignmentFlag.AlignVCenter, AlignmentFlag.AlignBaseline}
LEFT = 1
HCENTER = 4
RIGHT = 2
JUSTIFY = 8
HORIZONTAL_ALIGNS = {AlignmentFlag.AlignLeft, AlignmentFlag.AlignRight, AlignmentFlag.AlignHCenter, AlignmentFlag.AlignJustify}
__init__(editable=True, selectable=True, enabled=True, user_checkable=True, text='', vertical_align=AlignmentFlag.AlignVCenter, horizontal_align=AlignmentFlag.AlignHCenter)

QTableWidgetItem item which holds the value (numerical if appropriate) of text hence sorting the items properly if they are numbers. Also can easily set the item’s state and text allignment.

Parameters
  • editable (bool) – Whether the items will be configured to be editable; only occurs if the items have the option to be editable.

  • selectable (bool) – If true then item will be selectable, else not.

  • enabled (bool) – If true then item will be enabled, else not.

  • user_checkable (bool) – If true then item will be checkable to user, else not.

  • text (str) – The text for the table item

  • vertical_align (str) – Define vertical align style to top, center, or bottom. Bottom uses AlignBaseline instead of AlignBottom as AlignBottom causes text to disappear.

  • horizontal_align (str) – Define horizontal align style to left, center, right, or justify.

Raises

AssertionError if value of horizontal_align is not left, center, right, or justify.

Raises

AssertionError if value of vertical_align is not top, center, or bottom.

getValue()

Get the value of the current text if it is numerical text.

Return type

float or text

Returns

float if text is numerical text, else will return text itself.

copy()

Return copy of current item with same flags and text as the current one.

Return type

STableWidgetItem (or current class)

Returns

copy of current item

class schrodinger.ui.qt.swidgets.STableWidget(*arg, columns=None, column_names=None, table_data=None, row_data_names=None, sort_column=None, sort_style='ascending', select_row=False, resize_header=False, layout=None, row_data_col=None, **kwargs)

Bases: PyQt6.QtWidgets.QTableWidget

A better table widget

SORT_ASC = 'ascending'
__init__(*arg, columns=None, column_names=None, table_data=None, row_data_names=None, sort_column=None, sort_style='ascending', select_row=False, resize_header=False, layout=None, row_data_col=None, **kwargs)

Create a STableWidget instance.

Parameters
  • table_data (numpy.ndarray or list) – 2-dimension numpy array containing data for the table or list of list where inner lists is list of values for each row.

  • columns (dict) – Ordered dictionary with key as column names and value as the STableWidgetItem. This item will be used a base item for all the items for the column. None can be used for the value for columns that contain only widgets.

  • column_names (list) – list of column names and base item for each column will be set as STableWidgetItem. If both columns and column_name is provided then column_names are ignored.

  • row_data_names (list) – list containing names of each row data. row_data is data stored in under user role in table item widget in the row_data_col column.

  • sort_column (str or int or None) – name or index of column to sort by. If none then sort is not enabled.

  • sort_style (str) – select sorting type between ascending or descending

  • select_row (bool) – enable selection of rows rather than individual items

  • resize_header (bool or str) – If True, resize last column header to fill the available space. The size cannot be changed by the user or programmatically. If a string, must be the name of the column that will stretch to fill all available space.

  • layout (QLayout) – If supplied, the STableWidget created will be added to the layout.

  • row_data_col (str) – The header name for the column that will store any row data

resizeHeaders()

If necessary, sets the width of the table headers and sets the appropriate column to a stretch mode

cellWidget(*args)

Get the widget for the cell

Overwrites parent method to account for CenteringWidgets that hold the widget of interest as a child widget

See parent method for additional details

updateColumnNames()

Updates the column count and header labels according to the contents of self.columns.

setColumnCount(columns)

Sets the number of columns in the table to columns. If this is less than columnCount(), the data in the unwanted columns is discarded. If it is more than columnCount() then default base item is created for the column

Parameters

columns (int) – Number of columns for the table

setHorizontalHeaderLabels(columns)

Sets the horizontal header labels using labels.

Parameters

columns (list) – list of column labels for the table. Only the name will be changed for the column and the base item will remain the same.

setSortingEnabled(enable, sorting_column=0, sort_style='ascending')

Update parent class to enable sorting by set column

Parameters
  • enable (bool) – If enable is true it enables sorting for the table and immediately triggers a call to sortByColumn() with the set sorting column and style

  • sort_column (str or int or None) – name or index of column to sort by. If none then sort is not enabled.

  • sort_type (str) – select sorting type between ascending or descending

getRows(selected_only=False)

A generator for all table rows.

Parameters

selected_only (bool) – If true it will only return selected rows

Return type

list

Returns

Iterates over each row to return list of QTableWidgetItem

getSelectedRowIndexes()

Get row indexes numbers of selected rows.

Return type

list

Returns

list containing indexes of selected rows

addRow(data, return_sorted=True, editable=True)

Add a row to the table.

Parameters
  • data (list or dict) – list data values for the column ordered as columns are. followed by row data values in order of as set in row_data_names. If a dict is supplied, keys are column names or row data names and values are the values for that column/row data. Any keys missing from the dict will cause nothing to be added to that column. Widgets can be added to any column simply by supplying a widget as the list item/dict value for that column. For an empty cell, pass an empty string as the value of the list item. Note that a None value will skip the setCell() function.

  • return_sorted (bool) – return sorted table

  • editable (bool) – Whether the added items will be configured to be editable; only occurs if the items have the option to be editable.

addColumn(column_name, base_item=None, index=None)

Add a column to the table

Parameters
  • column_name (str) – The header of the new column to add

  • base_item (STableWidgetItem) – The base item for all items in this new column. If None, then the base item will be an empty STableWidgetItem.

  • index (int) – The 0-indexed location at which you want to add the column. If None, the new column will be appended to the end.

Raises

ValueError – If a duplicate column_name is provided.

insertColumn(column)

The insertColumn method of QTableWidget is unsafe to use in STableWidget. Please use the addColumn method instead.

setCell(value, row_idx, col_idx, editable=True)

Sets a cell in the table to the given value

Parameters
  • value (str or QtWidgets.QWidget) – the value to set the cell to

  • row_idx (int) – the row index of the cell you want to set

  • col_idx (int) – the column index of the cell you want to set

  • editable (bool) – Whether the item will be configured to be editable; only occurs if the item has the option to be editable.

getColumnIndex(column_name)

Get index of the given column name. Row data columns are not indexable.

Parameters

column_name (str) – Name of the column of get index of

Return type

int

Returns

index of the given column

sortRows()

Sort the rows by given sortable column

addRows(table_data, editable=True)

Add a rows to the table

Parameters
  • table_data (numpy.ndarray or list) – 2-dimension numpy array containing data for the table or list of list where inner lists is list of values for each row.

  • editable (bool) – Whether the added items will be configured to be editable; only occurs if the items have the option to be editable.

deleteAllRows()

Delete all rows in the table.

deleteSelectedRows()

Delete the selected rows from the table.

deleteColumn(column_name)

Deletes the column with the given name/header

Parameters

column_name (str) – the header of the column you want to delete

Raises

ValueError – if the name of the given column does not exist in this table

reset()

Reset the table by deleting all the rows and reverting the columns to their initial state

selectOnlyRows(rows)

Select only specified rows

Parameters

rows (list) – list of row numbers

class schrodinger.ui.qt.swidgets.ProjectTableButton(parent=None)

Bases: PyQt6.QtWidgets.QToolButton

A button with a project table logo. When clicked, it will open the project table panel.

__init__(parent=None)
launchProjectTable()
class schrodinger.ui.qt.swidgets.TextSearchBar(parent=None, placeholder_text='text in page')

Bases: PyQt6.QtWidgets.QWidget

A compound widget for performing a simple text search. Consists of a text field with placeholder, previous and next match buttons, and a cancel button that will hide the search bar.

nextMatchRequested

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

prevMatchRequested

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(parent=None, placeholder_text='text in page')
Parameters

placeholder_text (str) – placeholder text to show in the text field

onPrevBtnClicked()
onNextBtnClicked()
searchKeyPressed(e)

Checks a QEvent from keyPressEvent for the search bar invocation key combo (i.e. Ctrl-F or Cmd-F). If the key combo is detected, show the search bar, put focus on the text field, and return True. Otherwise return False.

Typical usage in MyPanel:

def keyPressEvent(self, e):
    if self.search_bar.searchKeyPressed(e):
        return
    super(MyPanel, self).keyPressEvent(e)
Parameters

e (QEvent) – the event to be checked

schrodinger.ui.qt.swidgets.get_picture_as_text(pic, width=200, height=150)

Saves a QPicture to an image, returns the 64 base string for the image, so that it can be displayed as a tooltip.

class schrodinger.ui.qt.swidgets.SpinBoxDoubleSlider(parent=None, range_min=- 1.0, range_max=1.0, min_value=- 1.0, max_value=1.0, stepsize=0.2, decimals=2, command=None, nocall=True, layout=None)

Bases: PyQt6.QtWidgets.QWidget

This widget is made up of a double slider widget with a double spinbox on each side. It allows selection of a sub-range from a given range of values.

Originally copied from mmshare/python/scripts/watermap_result_gui_dir/cutoff_slider.py and expanded with additional functionality.

cutoffChanged

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(parent=None, range_min=- 1.0, range_max=1.0, min_value=- 1.0, max_value=1.0, stepsize=0.2, decimals=2, command=None, nocall=True, layout=None)

Create an SpinBoxDoubleSlider object

Parameters
  • parent (QObject) – the parent object of this SpinBoxDoubleSlider

  • minimum – The minimum value this SpinBoxDoubleSlider can take on. The reset method will also reset the range of the slider using this value.

  • maximum – The maximum value this SpinBoxDoubleSlider can take on. The reset method will also reset the range of the slider using this value.

  • value – The initial minimum (left slider) value of this SpinBoxDoubleSlider. This value will also be used as the default left slider value by the reset method.

  • value – The initial maximum (right slider) value of this SpinBoxDoubleSlider. This value will also be used as the default right slider value by the reset method.

  • stepsize (float) – The stepsize each spinbox arrow click changes the value by

  • decimals (int) – Number of decimal places to display in each spinbox

  • layout (QLayout) – If supplied, the SpinBoxDoubleSlider created will be added to this layout

  • command (python callable) – The callback for the cutoffChanged signal. This command will be called during initialization unless nocall is set to True.

  • nocall (bool) – True if the callback command should not be called during initialization, False if the command should be called.

showEvent(event)

See parent class for documentation

setStepSize(stepsize)

Set the stepsize values for both spinboxes

Parameters

stepsize (float) – The new stepsize

setRange(min_range, max_range)

Set the range for the slider and the spinboxes

Parameters
  • min_range (float) – The minimum value

  • max_range (float) – The maximum value

getRange()
setValues(lpos, rpos)
getValues()
getTrueValues()

Get the actual min and max values rather than that represented by the spin box. The two may differ because the spinbox values are truncated at a certain number of decimal points

Return type

(float, float)

Returns

The values of the left and right sliders

reset()

Reset the spinboxes and sliders to their original value. Only the values are reset, not other parameters (consistent with other swidgets such as spinboxes

class schrodinger.ui.qt.swidgets.EditWithFocusOutEvent(*args, focus_out_command=None, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SLabeledEdit

SLabeledEdit that calls ‘focus_out_command’ on returnPressed() and on ‘focusOutEvent’ with modified text.

__init__(*args, focus_out_command=None, **kwargs)

Initialize EditWithFocusOutEvent.

Parameters

focus_out_command (method) – Method to be called when focus out event occurs

focusOutEvent(event)

Call self.focus_out_command when text modified, if present. This does NOT create race conditions with SLineEdit.eventFilter for always_valid=True. And the focus_out_command is only executed when the text is changed.

Parameters

event (QEvent) – Focus out event

class schrodinger.ui.qt.swidgets.SLabeledSlider(text, parent=None, minimum=1, maximum=100, stepsize=1, ticks=True, tick_interval=25, value=50, float_step=1, float_decimals=2, layout=None, command=None, nocall=True, stretch=True, after_label=None, value_label=True, orientation='horizontal', tip=None)

Bases: PyQt6.QtWidgets.QSlider

A slider with text label to the left of it and a value label to the right of it that gives the current slider value. An additional label to the right of the value label (“after_label”) can be used for units, etc. The slider can be used to control and display integer or floating point data.

The widget has a mylayout property that points to the internal layout that contains all the widgets. This layout is added to the layout provided by the “layout” keyword, or can be manually added to a layout after creation.

__init__(text, parent=None, minimum=1, maximum=100, stepsize=1, ticks=True, tick_interval=25, value=50, float_step=1, float_decimals=2, layout=None, command=None, nocall=True, stretch=True, after_label=None, value_label=True, orientation='horizontal', tip=None)

Create an SLabeledSlider object

Parameters
  • text (str or None) – The text of the label - if None, no leading label is created

  • parent (QObject) – the parent object of this SLabeledSlider

  • minimum (int) – The minimum value of this SLabeledSlider

  • maximum (int) – The maximum value of this SLabeledSlider

  • stepsize (int) – The amount the value changes each time an arrow key is pressed

  • tick_interval (int) – The interval between tick marks

  • value (int) – The initial value of this SLabeledSlider. This value will also be used as the default value by the reset method.

  • float_step (float) – QSliders only deal with integer values but often need to control float values. Use float_step to provide the factor that the slider integer value gets multiplied by to get the float value. This floating point value is displayed in the value_label and returned by the floatValue method.

  • float_decimals (int) – The number of decimal places to show in the value_label if the value_label is displayed and float_step is provided.

  • layout (QLayout) – If supplied, the SLabeledSlider created will be added to this layout

  • command (python callable) – The callback for the valueChanged signal. This command will not be called during initialization unless nocall is set to False.

  • nocall (bool) – True (default) if the callback command should not be called during initialization, False if the command should be called.

  • stretch (bool) – Whether to put a stretch after the SLabeledSlider (or after the after_label). Default is True.

  • after_label (str) – Label text to put after the SLabeledSlider - default is None

  • value_label (bool) – If True, place a label directly after the slider that gives the current value of the slider. Units can be added to this value via the after_label keyword. The after_label will be placed immediately after the value_label.

  • orientation (str) – The orientation of the slider. Should be one of the module constants VERTICAL or HORIZONTAL.

  • tip (str) – The tooltip to apply to the labels and slider

setToolTip(tip)

Add the tooltip to the slider and all labels

Parameters

tip (str) – The tooltip to add

setEnabled(state)

Set the slider’s and labels’ enabled states

Parameters

state (bool) – Whether the slider and labels are enabled or not

setMaximum(maximum)

Set the maximum value possible for the slider

Parameters

maximum (int) – The maximum value for the slider

reset()

Reset the value of the slider

setupValueLabel()

Set up the value label. Can be called to setup a label in a custom layout as the widget’s value label

updateValueLabel()

Set the value label text based on the current slider value

floatValue()

Get the current float value. The float value differs from the slider value in that the slider value is an integer, while the float value is a float calculated by multiplying float_step by the integer value.

Return type

float

Returns

The current widget float value

setFloatValue(float_value)

Set the current float value of the slider. The value gets rounded to the nearest acceptable slider value.

Parameters

float_value (float) – The value to set

toInt(float_value)

Convert a float value to the equivalent int value for the slider

Parameters

float_value (float) – The value to convert

Return type

int

Returns

The integer equivalent of float_value

setFloatMaximum(float_maximum)

Set the maximum float value of the slider. The maximum gets rounded to the nearest acceptable slider value.

Parameters

float_maximum (float) – The new maximum

setFloatMinimum(float_minimum)

Set the minimum float value of the slider. The minimum gets rounded to the nearest acceptable slider float value.

Parameters

float_minimum (float) – The new minimum

setVisible(state)

Set all child widgets to the visible state

Parameters

state (bool) – True if widgets should be visible, False if not

class schrodinger.ui.qt.swidgets.STabWidget(parent=None, tabs=None, layout=None, command=None, nocall=True)

Bases: PyQt6.QtWidgets.QTabWidget

A QTabWidget with additional convenience methods

__init__(parent=None, tabs=None, layout=None, command=None, nocall=True)

Create an STabWidget instance

Parameters
  • parent (QWidget) – The parent widget for this widget

  • tabs (dict) – Tabs to create and add to the STabWidget. Keys are tab labels, values are widgets for that tab

  • layout (QLayout) – If supplied, the STabWidget created will be added to this layout

  • command (python callable) – The callback for the currentChanged signal. This command will not be called during initialization unless nocall is set to False.

  • nocall (bool) – True (default) if the callback command should not be called during initialization, False if the command should be called.

reset()

Reset the STabWidget by calling reset on each individual tab. Tabs without a reset() method will be skipped

tabs()

A generator for all tab widgets

Return type

QWidget

Returns

Iterates over each tab widget in index order

getTabByLabel(label)

Return the tab widget with the given label

Parameters

label (str) – The label of the desired tab

Return type

QWidget

Returns

The tab widget with the given label

Raises

ValueError – If no tab with this label is found

setCurrentLabel(label)

Set the tab with the given label to be the current tab

Parameters

label (str) – The label of the tab to make current

currentLabel()

Get the label of the current tab

Return type

str

Returns

The label of the current tab

class schrodinger.ui.qt.swidgets.PlaceholderComboMixin(parent=None, placeholder='Please select an option...', **kwargs)

Bases: object

Deprecated in favor of combo_boxes.ItalicsPlaceholderComboBox, which uses the new Qt API for setting placeholder text, and is a widget instead of a mixin.

__init__(parent=None, placeholder='Please select an option...', **kwargs)
paintEvent(event)

This reimplements QComboBox.paintEvent based on the C++ implementation.

It uses italic font to paint _placeholder_text when the index is -1

class schrodinger.ui.qt.swidgets.StyleMixin

Bases: object

In order to style custom QWidget subclasses using stylesheet, this custom paintEvent method must be implemented.

paintEvent(e)

See QtWidgets.QWidget documentation for more information.

class schrodinger.ui.qt.swidgets.SRetainableMenu(*args, **kwargs)

Bases: PyQt6.QtWidgets.QMenu

A menu that doesn’t get closed after selecting an item

__init__(*args, **kwargs)
eventFilter(self, a0: QObject, a1: QEvent) bool
class schrodinger.ui.qt.swidgets.SSplitter(orientation=Orientation.Horizontal, collapsible=False, expanding=True, layout=None, widgets=None, **kwargs)

Bases: PyQt6.QtWidgets.QSplitter

__init__(orientation=Orientation.Horizontal, collapsible=False, expanding=True, layout=None, widgets=None, **kwargs)

A customized QSplitter widget

Parameters
  • orientation (enum) – Either Qt.Horiztonal or Qt.Vertical

  • collapsible (bool) – Whether the panes can be collapsed or not

  • expanding (bool) – Whether the splitter can expand in the direction opposite of the splitter orientation

  • layout (QtWidgets.QBoxLayout) – The layout to place this into

  • widgets (list) – A list of widgets to add to the splitter

class schrodinger.ui.qt.swidgets.CenteringWidget(widget, layout_margins=None)

Bases: PyQt6.QtWidgets.QWidget

A widget used to center other widgets when placed in a table cell

__init__(widget, layout_margins=None)

Create a CenteringWidget object

Parameters

widget (QtWidgets.QWidget) – The widget to center

class schrodinger.ui.qt.swidgets.SelectorWithPopUp(label, default_selection, layout=None, stretch=True)

Bases: schrodinger.ui.qt.swidgets.SFrame

A frame that contains a label, read-only line edit, and a tool button that shows a pop up list. Requires a TOOL_BUTTON_CLASS to be defined in children.

__init__(label, default_selection, layout=None, stretch=True)

Create a SelectorWithPopUp instance

Parameters
  • label (str) – The label for the edit

  • default_selection (str) – The default selection for the edit and list

  • layout (QLayout) – The layout to place the frame in

getSelection()

Get the current selection

Return type

str

Returns

The current selection

clearFilters()

Clear the filters and make all options visible

selectionChanged()

Callback for when a new item is selected in the pop up list

schrodinger.ui.qt.swidgets.center_widget_in_table_cell(table, row, column, widget, layout_margins=None, item_type=<class 'schrodinger.ui.qt.swidgets.STableWidgetItem'>)

Centers the widget in the cell and adds a non-selectable widget item so the cell background can’t be selected

Parameters
  • table (QTableWidget) – The table that contains the cell & widget

  • row (int) – The row of the cell

  • column (int) – The column of the cell

  • widget (QWidget) – The widget that will be placed into the cell and centered

  • layout_margins (tuple) – Tuple containing left, top, right, and bottom margins to use around the layout

  • item_type (class) – The class for the create table widget item

class schrodinger.ui.qt.swidgets.DeleteButton(*args, command=None, horizontal_policy=Policy.Fixed, layout=None, tip=None)

Bases: PyQt6.QtWidgets.QToolButton

A QToolButton that accepts the delete command callback for the clicked() signal as an argument

__init__(*args, command=None, horizontal_policy=Policy.Fixed, layout=None, tip=None)

Accepts all arguments given for a QToolButton

Parameters
  • command (function) – Delete function to call when the button emits a ‘clicked’ signal

  • horizontal_policy (QtWidgets.QSizePolicy.Policy) – If QSizePolicy.Fixed (default), the button horizontal size policy will be ‘fixed’. If None, it will be the QtWidgets.QToolButton default. Otherwise, the horizontal policy will be set to the value given by this parameter.

  • layout (QLayout) – Layout to place the button in

  • tip (str) – The tooltip for this delete button

class schrodinger.ui.qt.swidgets.PersistentMenu(*args, **kwargs)

Bases: PyQt6.QtWidgets.QMenu

Menu that will persist when certain actions are triggered.

All actions that need to persist the menu should be added using addPersistentAction.

__init__(*args, **kwargs)
eventFilter(self, a0: QObject, a1: QEvent) bool
addPersistentAction(text: str, checkable: bool = False, checked: bool = False) PyQt6.QtGui.QAction

Add a persistent action to the menu.

removeAction(action: PyQt6.QtGui.QAction)

Remove the action from the persistent action set.

class schrodinger.ui.qt.swidgets.ItemsManagerMixin

Bases: object

A mixin that provides methods to save, delete, load and dump user created items to/from preferences. An item can be anything like ASL, SMARTS, Smiles, strings etc…

PREF_KEY = None
ITEM_TYPE_TEXT = 'item'
getNameAndSave(value, default_name='')

Shows a NewNameDialog to provide a name to save the value to preferences.

Parameters
  • value (Any builtin jsonable type. Ex: list but not set) – Value to be saved to preferences

  • default_name (str) – Default name to populate the NewNameDialog

deleteSavedItem(name)

Remove the saved item with this name from the preferences

Parameters

name (str) – Item name to remove

getSavedItems()

Get all saved items from preferences

Returns

Dict where keys are names and values are items

Return type

dict

dumpSavedItems(saved_items_dict)

Store all saved items to preferences

Parameters

saved_items_dict (dict) – dict where keys are names and values are items

class schrodinger.ui.qt.swidgets.StdMenuItem(name, value, parent)

Bases: PyQt6.QtWidgets.QPushButton

Menu item for the standard items (non-deletable)

Variables

itemClicked (QtCore.pyqtSignal) – A signal emitted when this standard item is clicked.

itemClicked

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(name, value, parent)
Parameters
  • name (str) – Display text of the menu item

  • value (str) – Internal value of the menu item

  • parent (QtWidgets.QWidget) – Parent of the item

class schrodinger.ui.qt.swidgets.SavedMenuItem(name, value, item_type_text='item')

Bases: PyQt6.QtWidgets.QWidget

Menu item for the user saved items, which can be deleted.

Variables
  • itemClicked (QtCore.pyqtSignal) – A signal emitted when this saved item is clicked. The value can be any builtin jsonable type.

  • deleteClicked (QtCore.pyqtSignal) – A signal emitted when this saved item is deleted

itemClicked

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

deleteClicked

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(name, value, item_type_text='item')
Parameters
  • name (str) – Display text of the menu item

  • value (str) – Internal value of the menu item

  • item_type_text (str) – Display text for the item type

class schrodinger.ui.qt.swidgets.SavedItemsManager(parent, item_clicked_func, get_value_func, std_items_file=None)

Bases: PyQt6.QtWidgets.QToolButton, schrodinger.ui.qt.swidgets.ItemsManagerMixin

A manager widget (basically a toolbutton), that manages standard and user saved items. Derive this class to manage a specific item like SMARTS, ASL, Smiles or normal strings.

On clicking, this toolbutton pops up a menu with the first item to save the item, followed by the list of already saved items and the last section with the list of standard items.

PREF_KEY = None
ITEM_TYPE_TEXT = 'item'
__init__(parent, item_clicked_func, get_value_func, std_items_file=None)
Parameters
  • parent (QtWidgets.QWidget) – The parent of this widget

  • item_clicked_func (callable) – Function to call when a menu item it clicked in the popup menu. Should take any builtin jsonable type.

  • get_value_func (callable) – Function to call to get the item value to be saved. Should take no arg and returns any builtin jsonable value.

  • std_items_file (str) – File path containing the standard items in json format. Should be a dict at top level containing items with item name as key and item value as value

readStdItems(std_items_file)

Read the standard items from the std_items_file. The standard items are specified in json format as below: {

name: value, name: value

}

Parameters

std_items_file (str) – File path containing the standard items in json format. Should be a dict at top level containing items with item name as key and item value as value

Returns

Returns a dict of standard items

Return type

dict

updateMenu()

Update the menu items in the popup menu. Can be overridden in child class to customize the menu

itemClicked(value)

Slot called when a menu item is clicked

Parameters

value (Any builtin jsonable type. Ex: list but not set) – Value of the item

saveItem(*_)

Slot called when the ‘Save’ menu item is clicked

Parameters

value (str) – The value arg is not used as the actual value is got by calling get_value_func method.

class schrodinger.ui.qt.swidgets.SavedSMARTSManager(parent, item_clicked_func, get_value_func, std_items_file=None)

Bases: schrodinger.ui.qt.swidgets.SavedItemsManager

Class that manages the user saved SMARTS

PREF_KEY = 'smarts_edit_saved_smarts'
ITEM_TYPE_TEXT = 'SMARTS'
ITEM_KEY = 'SMARTS'
class schrodinger.ui.qt.swidgets.InstantToolTipTableView(*args, **kwargs)

Bases: PyQt6.QtWidgets.QTableView

Variation of QTableView that shows tooltips for all cells instantaniously instead of after a delay.

__init__(*args, **kwargs)
mouseMoveEvent(self, e: QMouseEvent)
class schrodinger.ui.qt.swidgets.LineEditWithDisabledText(*args, disabled_text, **kwargs)

Bases: schrodinger.ui.qt.swidgets.SLabeledEdit

Line edit that shows a specific text in disabled state, similar to disabled_checkstate in swidgets.SCheckBox

__init__(*args, disabled_text, **kwargs)

Create an instance

Parameters

disabled_text (str) – The text to show when the widget is disabled

hasDisabledText()

Return whether the widget has disabled_text

Return type

bool

Returns

True if the widget has disabled_text, False otherwise

changeEvent(event)

Overrides the parent method to save & change the text when the widget is enabled/disabled (if requested)

forceSetText(text)

Change the text of the widget even if it is disabled and we are controlling the text of disabled widgets. Also sets this text to be the text when the widget re-enabled

Parameters

text (str) – The text to set

setText(text, only_if_valid=False)

Overrides the parent method to not actually change the text if the widget is disabled AND we’re controlling the text of disabled widgets. In that case, we only store the desired text for when the widget is re-enabled.

Parameters
  • text (str) – The text to set in the edit

  • only_if_valid (bool) – Only set the text if it validates as acceptable via the edit’s validator.