¿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 estableciendo setEnabled(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