class WidgetNome(QWidget): nomeModificado = pyqtSignal(str) def __init__(self, texto='', parent=None): super().__init__(parent) self._configurarGui(texto) self._lblNome.visivelModificado.connect(self._mostrarModificarGravar) self._lblNome.textoModificado.connect(lambda nome: self.nomeModificado.emit(nome)) self._btnGravar.clicked.connect(self._lblNome.mudarVisivel) def _configurarGui(self, texto): layout = QHBoxLayout() layout.setAlignment(Qt.AlignLeft) layout.setMargin(0) self._spacer = QSpacerItem(0,0,QSizePolicy.Expanding,QSizePolicy.Maximum) self._layoutSpacer = QHBoxLayout() self._layoutSpacer.addItem(self._spacer) lbl = QLabel('Nome: ', self) self._lblNome = EditLabel(texto) self._btnGravar = QPushButton('Modificar') layout.addWidget(lbl) layout.addWidget(self._lblNome) layout.addLayout(self._layoutSpacer) layout.addWidget(self._btnGravar) self.setLayout(layout) def _mostrarModificarGravar(self): if self._lblNome.isVisible(): self._btnGravar.setText('Modificar') self._layoutSpacer.addItem(self._spacer) else: self._btnGravar.setText('Gravar') self._layoutSpacer.removeItem(self._spacer) def getNome(self): return self._lblNome.getTexto() def setNome(self, nome): self._lblNome.setTexto(str(nome))
class RadioBox(QWidget): def __init__(self, parent=None, items=None, spread=True): # If spread is False, insert a spacer in the layout so that the items don't use all the # space they're given but rather align left. if items is None: items = [] QWidget.__init__(self, parent) self._buttons = [] self._labels = items self._selected_index = 0 self._spacer = horizontalSpacer() if not spread else None self._layout = QHBoxLayout(self) self._update_buttons() #--- Private def _update_buttons(self): if self._spacer is not None: self._layout.removeItem(self._spacer) to_remove = self._buttons[len(self._labels):] for button in to_remove: self._layout.removeWidget(button) button.setParent(None) del self._buttons[len(self._labels):] to_add = self._labels[len(self._buttons):] for _ in to_add: button = QRadioButton(self) self._buttons.append(button) self._layout.addWidget(button) button.toggled.connect(self.buttonToggled) if self._spacer is not None: self._layout.addItem(self._spacer) if not self._buttons: return for button, label in zip(self._buttons, self._labels): button.setText(label) self._update_selection() def _update_selection(self): self._selected_index = max( 0, min(self._selected_index, len(self._buttons) - 1)) selected = self._buttons[self._selected_index] selected.setChecked(True) #--- Event Handlers def buttonToggled(self): for i, button in enumerate(self._buttons): if button.isChecked(): self._selected_index = i self.itemSelected.emit(i) break #--- Signals itemSelected = pyqtSignal(int) #--- Properties @property def buttons(self): return self._buttons[:] @property def items(self): return self._labels[:] @items.setter def items(self, value): self._labels = value self._update_buttons() @property def selected_index(self): return self._selected_index @selected_index.setter def selected_index(self, value): self._selected_index = value self._update_selection()
class RadioBox(QWidget): def __init__(self, parent=None, items=None, spread=True): # If spread is False, insert a spacer in the layout so that the items don't use all the # space they're given but rather align left. if items is None: items = [] QWidget.__init__(self, parent) self._buttons = [] self._labels = items self._selected_index = 0 self._spacer = horizontalSpacer() if not spread else None self._layout = QHBoxLayout(self) self._update_buttons() #--- Private def _update_buttons(self): if self._spacer is not None: self._layout.removeItem(self._spacer) to_remove = self._buttons[len(self._labels):] for button in to_remove: self._layout.removeWidget(button) button.setParent(None) del self._buttons[len(self._labels):] to_add = self._labels[len(self._buttons):] for _ in to_add: button = QRadioButton(self) self._buttons.append(button) self._layout.addWidget(button) button.toggled.connect(self.buttonToggled) if self._spacer is not None: self._layout.addItem(self._spacer) if not self._buttons: return for button, label in zip(self._buttons, self._labels): button.setText(label) self._update_selection() def _update_selection(self): self._selected_index = max(0, min(self._selected_index, len(self._buttons)-1)) selected = self._buttons[self._selected_index] selected.setChecked(True) #--- Event Handlers def buttonToggled(self): for i, button in enumerate(self._buttons): if button.isChecked(): self._selected_index = i self.itemSelected.emit(i) break #--- Signals itemSelected = pyqtSignal(int) #--- Properties @property def buttons(self): return self._buttons[:] @property def items(self): return self._labels[:] @items.setter def items(self, value): self._labels = value self._update_buttons() @property def selected_index(self): return self._selected_index @selected_index.setter def selected_index(self, value): self._selected_index = value self._update_selection()