¿Cómo desactivar todos los widgets excepto uno en el inicio de formularios o mostrar en PyQt5?
He diseñado una forma QDialog en la que he colocado diferentes widgets para hacer algunos cálculos. Sin embargo, todo está funcionando según planes. Excepto que quiero desactivar todos los widgets excepto uno para la entrada inicial. Quiero que los widgets sigan la orden de la ficha. Después de haber ingresado datos, debe activar o activar el botón siguiente al final. Los widgets anteriores deben desactivar el enfoque y desactivarse tan pronto como se haga con ellos. Pero cuando haga clic en el último botón, el primer widget debe volver a ser activo, para permitir la entrada fresca de datos. He utilizado PyQt5 diseñador versión 5.11 para diseñar.
Pregunta hecha hace 3 años, 4 meses, 27 días - Por webweaverx
2 Respuestas:
-
Para desactivar todos los widgets en un formulario y luego activar uno al inicio, puedes hacer lo siguiente en PyQt5:
- Crear una función para desactivar todos los widgets en un formulario:
python def desactivar_widgets(formulario): for widget in formulario.findChildren(QWidget): widget.setEnabled(False)
- Crear una función para activar un widget específico:
python def activar_widget(widget): widget.setEnabled(True) widget.setFocus()
- Llamar a estas funciones en el inicio de tu formulario:
python class MiDialog(QDialog): def __init__(self): super().__init__() uic.loadUi("mi_formulario.ui", self)
Desactivar todos los widgets al inicio
desactivar_widgets(self)Activar el widget que deseas al inicio (por ejemplo, un QLineEdit)
self.lineEdit_1.setEnabled(True) self.lineEdit_1.setFocus()- Para después activar el siguiente widget al completar la entrada de datos y presionar un botón, puedes conectar la señal del botón a una función que active el siguiente widget y desactive el actual:
python class MiDialog(QDialog): def __init__(self): super().__init__() uic.loadUi("mi_formulario.ui", self)
Conectar señal del botón para activar el siguiente widget y desactivar el actual
self.pushButton_next.clicked.connect(self.activar_siguiente_widget) def activar_siguiente_widget(self):Desactivar widget actual
sender = self.sender() sender.setEnabled(False)Encontrar el siguiente widget y activarlo
siguiente_widget_index = self.layout().indexOf(sender) + 1 siguiente_widget = self.layout().itemAt(siguiente_widget_index).widget() siguiente_widget.setEnabled(True) siguiente_widget.setFocus()Estos pasos te permitirán desactivar todos los widgets en un formulario al inicio, activar uno al inicio y luego activar los siguientes en orden después de completar la entrada de datos.
Respondida el Dec 20, 2020 a las 14:30 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Desactivando todos los widgets excepto uno en PyQt5:
Para desactivar todos los widgets excepto uno en PyQt5 al inicio del formulario, puedes utilizar el método
setEnabled(False)
en todos los widgets que deseas desactivar. Luego, habilita el widget deseado estableciendosetEnabled(True)
para ese widget. Aquí tienes un ejemplo:python
Obtener todos los widgets del formulario
widgets = self.findChildren(QWidget)Desactivar todos los widgets
for widget in widgets: widget.setEnabled(False)Habilitar el widget deseado
self.widget_a.setEnabled(True)Habilitar el botón siguiente
self.next_button.setEnabled(True)Activando widgets según el orden de las pestañas:
Después de que el usuario ingrese datos en un widget, puedes activar el siguiente widget en el orden de las pestañas utilizando el método
setFocus()
. Aquí tienes un ejemplo:python def next_widget(self):
Obtener el índice del widget actual
index = self.tabWidget.currentIndex()Mover al siguiente widget
self.tabWidget.setCurrentIndex(index + 1)Obtener el widget actual
widget = self.tabWidget.currentWidget()Activar el widget actual
widget.setFocus()Activando el primer widget después de hacer clic en el último botón:
Puedes activar el primer widget después de hacer clic en el último botón conectando el evento
clicked
del último botón a un manejador que restablezca el índice de la pestaña al 0. Aquí tienes un ejemplo:python def reset_form(self):
Restablecer el índice de la pestaña a 0
self.tabWidget.setCurrentIndex(0)Obtener el primer widget
widget = self.tabWidget.currentWidget()Activar el primer widget
widget.setFocus()Ejemplo completo:
El siguiente es un ejemplo de código que implementa las funcionalidades descritas anteriormente:
python import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QDialog, QPushButton, QTabWidget, QWidget, QVBoxLayout class MyDialog(QDialog): def __init__(self): super().__init__()
Crear widgets
self.tab_widget = QTabWidget() self.tab1 = QWidget() self.tab2 = QWidget() self.tab3 = QWidget() self.next_button = QPushButton("Siguiente") self.reset_button = QPushButton("Reiniciar")Configurar pestañas
self.tab_widget.addTab(self.tab1, "Pestaña 1") self.tab_widget.addTab(self.tab2, "Pestaña 2") self.tab_widget.addTab(self.tab3, "Pestaña 3")Configurar diseños
vbox = QVBoxLayout() vbox.addWidget(self.tab_widget) vbox.addWidget(self.next_button) vbox.addWidget(self.reset_button) self.setLayout(vbox)Conectar señales
self.next_button.clicked.connect(self.next_widget) self.reset_button.clicked.connect(self.reset_form)Desactivar todos los widgets excepto el primero
self.disable_all_widgets() def disable_all_widgets(self): for widget in self.findChildren(QWidget): widget.setEnabled(False) self.tab1.setEnabled(True) self.next_button.setEnabled(True) def next_widget(self): index = self.tab_widget.currentIndex() self.tab_widget.setCurrentIndex(index + 1) widget = self.tab_widget.currentWidget() widget.setFocus() def reset_form(self): self.tab_widget.setCurrentIndex(0) widget = self.tab_widget.currentWidget() widget.setFocus() if __name__ == "__main__": app = QApplication(sys.argv) dialog = MyDialog() dialog.show() sys.exit(app.exec_())Respondida el Dec 20, 2020 a las 14:35 - por Gemini
Votos positivos: 0 | Votos negativos: 0