def make_item(val, key=None): item = QLineEdit() item.setText(str(val)) item.setValidator(QDoubleValidator(item)) item.setFrame(False) if key: item.editingFinished.connect(make_handler(item=item, key=key)) return item
def eventFilter(self, object: QLineEdit, event: QEvent): if event.type() == QEvent.FocusIn: object.setFrame(True) object.setReadOnly(False) return True if event.type() == QEvent.FocusOut: if object.text(): object.setFrame(False) object.setReadOnly(True) return True return False
def createEditor(self, parent, option, index): # ToDo: set dec placed for IN and MM machines col = self._columns[index.column()] if col == 'R': editor = QLineEdit(parent) editor.setFrame(False) margins = editor.textMargins() padding = editor.fontMetrics().width(self._padding) + 1 margins.setLeft(margins.left() + padding) editor.setTextMargins(margins) return editor elif col in 'TPQ': editor = QSpinBox(parent) editor.setFrame(False) editor.setAlignment(Qt.AlignCenter) if col == 'Q': editor.setMaximum(9) else: editor.setMaximum(99999) return editor elif col in 'XYZABCUVWD': editor = QDoubleSpinBox(parent) editor.setFrame(False) editor.setAlignment(Qt.AlignCenter) editor.setDecimals(4) # editor.setStepType(QSpinBox.AdaptiveDecimalStepType) editor.setProperty('stepType', 1) # stepType was added in 5.12 editor.setRange(-1000, 1000) return editor elif col in 'IJ': editor = QDoubleSpinBox(parent) editor.setFrame(False) editor.setAlignment(Qt.AlignCenter) editor.setMaximum(360.0) editor.setMinimum(0.0) editor.setDecimals(4) # editor.setStepType(QSpinBox.AdaptiveDecimalStepType) editor.setProperty('stepType', 1) # stepType was added in 5.12 return editor return None
class PlotNameWidget(QWidget): """A widget to display the plot name, and edit and close buttons This widget is added to the table widget to support the renaming and close buttons, as well as the direct renaming functionality. """ def __init__(self, presenter, plot_number, parent=None): super(PlotNameWidget, self).__init__(parent) self.presenter = presenter self.plot_number = plot_number self.mutex = QMutex() self.line_edit = QLineEdit( self.presenter.get_plot_name_from_number(plot_number)) self.line_edit.setReadOnly(True) self.line_edit.setFrame(False) # changes the line edit to look like normal even when self.line_edit.setStyleSheet( """* { background-color: rgba(0, 0, 0, 0); } QLineEdit:disabled { color: black; }""") self.line_edit.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.line_edit.editingFinished.connect(self.rename_plot) # Disabling the line edit prevents it from temporarily # grabbing focus when changing code editors - this triggered # the editingFinished signal, which was causing #26305 self.line_edit.setDisabled(True) shown_icon = get_icon('mdi.eye') self.hide_button = QPushButton(shown_icon, "") self.hide_button.setToolTip('Hide') self.hide_button.setFlat(True) self.hide_button.setMaximumWidth(self.hide_button.iconSize().width() * 5 / 3) self.hide_button.clicked.connect(self.toggle_visibility) rename_icon = get_icon('mdi.square-edit-outline') self.rename_button = QPushButton(rename_icon, "") self.rename_button.setToolTip('Rename') self.rename_button.setFlat(True) self.rename_button.setMaximumWidth( self.rename_button.iconSize().width() * 5 / 3) self.rename_button.setCheckable(True) self.rename_button.toggled.connect(self.rename_button_toggled) close_icon = get_icon('mdi.close') self.close_button = QPushButton(close_icon, "") self.close_button.setToolTip('Delete') self.close_button.setFlat(True) self.close_button.setMaximumWidth( self.close_button.iconSize().width() * 5 / 3) self.close_button.clicked.connect( lambda: self.close_pressed(self.plot_number)) self.layout = QHBoxLayout() # Get rid of the top and bottom margins - the button provides # some natural margin anyway. Get rid of right margin and # reduce spacing to get buttons closer together. self.layout.setContentsMargins(5, 0, 0, 0) self.layout.setSpacing(0) self.layout.addWidget(self.line_edit) self.layout.addWidget(self.hide_button) self.layout.addWidget(self.rename_button) self.layout.addWidget(self.close_button) self.layout.sizeHint() self.setLayout(self.layout) def set_plot_name(self, new_name): """ Sets the internally stored and displayed plot name :param new_name: The name to set """ self.line_edit.setText(new_name) def close_pressed(self, plot_number): """ Close the plot with the given name :param plot_number: The unique number in GlobalFigureManager """ self.presenter.close_single_plot(plot_number) def rename_button_toggled(self, checked): """ If the rename button is pressed from being unchecked then make the line edit item editable :param checked: True if the rename toggle is now pressed """ if checked: self.toggle_plot_name_editable(True, toggle_rename_button=False) def toggle_plot_name_editable(self, editable, toggle_rename_button=True): """ Set the line edit item to be editable or not editable. If editable move the cursor focus to the editable name and highlight it all. :param editable: If true make the plot name editable, else make it read only :param toggle_rename_button: If true also toggle the rename button state """ self.line_edit.setReadOnly(not editable) self.line_edit.setDisabled(not editable) self.line_edit.setAttribute(Qt.WA_TransparentForMouseEvents, not editable) # This is a sneaky way to avoid the issue of two calls to # this toggle method, by effectively disabling the button # press in edit mode. self.rename_button.setAttribute(Qt.WA_TransparentForMouseEvents, editable) if toggle_rename_button: self.rename_button.setChecked(editable) if editable: self.line_edit.setFocus() self.line_edit.selectAll() else: self.line_edit.setSelection(0, 0) def toggle_visibility(self): """ Calls the presenter to hide the selected plot """ self.presenter.toggle_plot_visibility(self.plot_number) def set_visibility_icon(self, is_shown): """ Change the widget icon between shown and hidden :param is_shown: True if plot is shown, false if hidden """ if is_shown: self.hide_button.setIcon(get_icon('mdi.eye')) self.hide_button.setToolTip('Hide') else: self.hide_button.setIcon(get_icon('mdi.eye', 'lightgrey')) self.hide_button.setToolTip('Show') def rename_plot(self): """ Called when the editing is finished, gets the presenter to do the real renaming of the plot """ self.presenter.rename_figure(self.plot_number, self.line_edit.text()) self.toggle_plot_name_editable(False)
def createEditor(self, parent: QWidget, option: QStyleOptionViewItem, index: QModelIndex) -> QWidget: editor = QLineEdit(parent) editor.setPlaceholderText(self._default_text) editor.setFrame(False) return editor
class PlotNameWidget(QWidget): """A widget to display the plot name, and edit and close buttons This widget is added to the table widget to support the renaming and close buttons, as well as the direct renaming functionality. """ def __init__(self, presenter, plot_number, parent=None): super(PlotNameWidget, self).__init__(parent) self.presenter = presenter self.plot_number = plot_number self.mutex = QMutex() self.line_edit = QLineEdit(self.presenter.get_plot_name_from_number(plot_number)) self.line_edit.setReadOnly(True) self.line_edit.setFrame(False) self.line_edit.setStyleSheet("* { background-color: rgba(0, 0, 0, 0); }") self.line_edit.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.line_edit.editingFinished.connect(self.rename_plot) shown_icon = get_icon('mdi.eye') self.hide_button = QPushButton(shown_icon, "") self.hide_button.setToolTip('Hide') self.hide_button.setFlat(True) self.hide_button.setMaximumWidth(self.hide_button.iconSize().width() * 5 / 3) self.hide_button.clicked.connect(self.toggle_visibility) rename_icon = get_icon('mdi.square-edit-outline') self.rename_button = QPushButton(rename_icon, "") self.rename_button.setToolTip('Rename') self.rename_button.setFlat(True) self.rename_button.setMaximumWidth(self.rename_button.iconSize().width() * 5 / 3) self.rename_button.setCheckable(True) self.rename_button.toggled.connect(self.rename_button_toggled) close_icon = get_icon('mdi.close') self.close_button = QPushButton(close_icon, "") self.close_button.setToolTip('Delete') self.close_button.setFlat(True) self.close_button.setMaximumWidth(self.close_button.iconSize().width() * 5 / 3) self.close_button.clicked.connect(lambda: self.close_pressed(self.plot_number)) self.layout = QHBoxLayout() # Get rid of the top and bottom margins - the button provides # some natural margin anyway. Get rid of right margin and # reduce spacing to get buttons closer together. self.layout.setContentsMargins(5, 0, 0, 0) self.layout.setSpacing(0) self.layout.addWidget(self.line_edit) self.layout.addWidget(self.hide_button) self.layout.addWidget(self.rename_button) self.layout.addWidget(self.close_button) self.layout.sizeHint() self.setLayout(self.layout) def set_plot_name(self, new_name): """ Sets the internally stored and displayed plot name :param new_name: The name to set """ self.line_edit.setText(new_name) def close_pressed(self, plot_number): """ Close the plot with the given name :param plot_number: The unique number in GlobalFigureManager """ self.presenter.close_single_plot(plot_number) def rename_button_toggled(self, checked): """ If the rename button is pressed from being unchecked then make the line edit item editable :param checked: True if the rename toggle is now pressed """ if checked: self.toggle_plot_name_editable(True, toggle_rename_button=False) def toggle_plot_name_editable(self, editable, toggle_rename_button=True): """ Set the line edit item to be editable or not editable. If editable move the cursor focus to the editable name and highlight it all. :param editable: If true make the plot name editable, else make it read only :param toggle_rename_button: If true also toggle the rename button state """ self.line_edit.setReadOnly(not editable) self.line_edit.setAttribute(Qt.WA_TransparentForMouseEvents, not editable) # This is a sneaky way to avoid the issue of two calls to # this toggle method, by effectively disabling the button # press in edit mode. self.rename_button.setAttribute(Qt.WA_TransparentForMouseEvents, editable) if toggle_rename_button: self.rename_button.setChecked(editable) if editable: self.line_edit.setFocus() self.line_edit.selectAll() else: self.line_edit.setSelection(0, 0) def toggle_visibility(self): """ Calls the presenter to hide the selected plot """ self.presenter.toggle_plot_visibility(self.plot_number) def set_visibility_icon(self, is_shown): """ Change the widget icon between shown and hidden :param is_shown: True if plot is shown, false if hidden """ if is_shown: self.hide_button.setIcon(get_icon('mdi.eye')) self.hide_button.setToolTip('Hide') else: self.hide_button.setIcon(get_icon('mdi.eye', 'lightgrey')) self.hide_button.setToolTip('Show') def rename_plot(self): """ Called when the editing is finished, gets the presenter to do the real renaming of the plot """ self.presenter.rename_figure(self.plot_number, self.line_edit.text()) self.toggle_plot_name_editable(False)