Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Controlar una Subventana del Menu Bar



  • Buenas, soy relativamente nuevo en la programación con Pyqt5, espero puedan ayudarme gracias.

    He creado un menú bar desde mi ventana principal (mwPrincipal) dentro del cual tengo una opción de data: self.menuData = QtWidgets.QMenu(self.menubar), la cual tiene una acción llamada Deflexiones : self.actionDeflexiones = QtWidgets.QAction(mwPrincipal), cuando doy click en dicha acción se crea una subventana (maximizado), dentro de la ventana principal la cual la he creado con QMdiSubWindow de la ventana padre.
    El detalle esta en que cuando pico en la acción (Deflexiones) se ha abre la subventana que es lo que deseo, pero si pico otra y otra vez en la acción(Deflexiones) sigue abriendo más pestañas de la subventana las cuales están superpuestas porque esta maximizado dicha subventana. Como puedo hacer para controlar una subventana que ya abrí para que no se vuelva abrir una nueva.

    Aqui muestro parte del codigo de la acción Deflexiones

    # Librería de Python
    import sys
    
    #Libreria
    from PyQt5 import QtCore, QtGui, QtWidgets  
    
    #Librerias Propietarias
    import entidades.entGlobales           as eg
    import funciones.funcBaseDatos         as fbd
    import funciones.funcGrales            as fg
    import entidades.data.entDeflexiones   as ed
    import modulo.data.modDeflexiones      as md
    import modulo.modBitacora              as mb
    import clases.claReportes              as cr
    import clases.claExportar              as ce
    
    # Dialogos a Desplegar
    import vista.data.dlgDeflexionesAC
    
    # Constantes
    INT_COL_ID           = 0
    INT_COL_PROGRESIVA   = 1
    INT_COL_CARGA        = 2
    INT_COL_D0           = 3
    INT_COL_D20          = 4
    INT_COL_D30          = 5
    INT_COL_D45          = 6
    INT_COL_D60          = 7
    INT_COL_D90          = 8
    INT_COL_D120         = 9
    INT_COL_D150         = 10
    
    #Definicion  la clase  
    class dlgDeflexiones():
        
        # Declaro Variable para registro de Bitacora ya que se va utilziar en varios lugares
        datBitacora =mb.mBitacora()  
    
        #Declaramos el objeto del modelo Deflexiones
        datDeflexiones = md.mDeflexiones()    
        
        #Constructor de la clase  ventanaPadre es el paramentro que le doy a contrucctor y que viene a ser el centralwidget
        def __init__(self, ventanaPadre):
            #Creo la subventana usando la ventana Padre y Coloco Titulo
            self.subWndDeflexiones = QtWidgets.QMdiSubWindow(ventanaPadre)
            self.subWndDeflexiones.setWindowTitle("Lista de Deflexiones")
            self.subWndDeflexiones.setWindowFlag(QtCore.Qt.WindowMinimizeButtonHint,False)  # quita el boton de minimizar en la ventana
            self.subWndDeflexiones.setWindowFlag(QtCore.Qt.WindowMaximizeButtonHint,False)  # quita el boton de maximizar en la ventana
            self.subWndDeflexiones.setWindowFlag(QtCore.Qt.WindowCloseButtonHint,False)
         
            #La barra superior
            self.horizontalLayoutWidget = QtWidgets.QWidget(self.subWndDeflexiones)
            
            #Pongo el alto a 30
            self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 23, ventanaPadre.geometry().width(),30))
            self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
            self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
            self.horizontalLayout.setContentsMargins(10, 0, 18, 0)
            self.horizontalLayout.setObjectName("horizontalLayout")
    
            #Los botones  yeel layout horizontal
            self.pbInsertarDeflexiones = QtWidgets.QPushButton(self.horizontalLayoutWidget)
            self.pbInsertarDeflexiones.setObjectName("pbInsertarDeflexiones")
            self.horizontalLayout.addWidget(self.pbInsertarDeflexiones)
            self.pbInsertarDeflexiones.clicked.connect(self.pbInsertarDeflexion_click)
                
            self.pbEditDeflexiones = QtWidgets.QPushButton(self.horizontalLayoutWidget)
            self.pbEditDeflexiones.setObjectName("pbEditDeflexiones")
            self.pbEditDeflexiones.clicked.connect(self.pbEditDeflexion_click)
            self.horizontalLayout.addWidget(self.pbEditDeflexiones)
                    
            self.pbEliminarDeflexiones = QtWidgets.QPushButton(self.horizontalLayoutWidget)
            self.pbEliminarDeflexiones.setObjectName("pbEliminarDeflexiones")
            self.pbEliminarDeflexiones.clicked.connect(self.pbEliminarDeflexion_click)
            self.horizontalLayout.addWidget(self.pbEliminarDeflexiones)
                    
            self.pbFiltrar = QtWidgets.QPushButton(self.horizontalLayoutWidget)
            self.pbFiltrar.setObjectName("pbFiltrar")
            self.pbFiltrar.clicked.connect(self.pbFiltrar_click)
            self.horizontalLayout.addWidget(self.pbFiltrar)
            self.pbFiltrar.clicked.connect(self.pbFiltrar_click)
            
            
            #Texto de entrada 
            self.leFiltrar = QtWidgets.QLineEdit(self.horizontalLayoutWidget)
            self.leFiltrar.setObjectName("leFiltrar")
            self.horizontalLayout.addWidget(self.leFiltrar)
            
            # los 3  botones restantes
            self.pbImprimirDeflexiones = QtWidgets.QPushButton(self.horizontalLayoutWidget)
            self.pbImprimirDeflexiones.setObjectName("pbImprimirDeflexiones")
            self.horizontalLayout.addWidget(self.pbImprimirDeflexiones)
            self.pbImprimirDeflexiones.clicked.connect(self.pbImprimirDeflexiones_click) # instruccion que se conecta al pusbton con la otr instruccion.
            
            self.pbExportarDeflexiones = QtWidgets.QPushButton(self.horizontalLayoutWidget)
            self.pbExportarDeflexiones.setObjectName("pbExportarDeflexiones")
            self.horizontalLayout.addWidget(self.pbExportarDeflexiones)
            self.pbExportarDeflexiones.clicked.connect(self.pbExportarDeflexiones_click) # instruccion que se conecta al pusbton con la otr instruccion.
            
            self.pbCerrarDeflexiones = QtWidgets.QPushButton(self.horizontalLayoutWidget)
            self.pbCerrarDeflexiones.setObjectName("pbCerrarDeflexiones")
            self.horizontalLayout.addWidget(self.pbCerrarDeflexiones)
            self.pbCerrarDeflexiones.clicked.connect(self.pbCerrarDeflexiones_click)
    
    
            # El layout Vertical 
            self.verticalLayoutWidget = QtWidgets.QWidget(self.subWndDeflexiones)
    
            #La dimension con centralwidget                         
            self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 55, 1000, ventanaPadre.geometry().height()-55))  # ( distancia al eje x en la subventana, distancia al eje Y en la subventana, Distancia en el eje x de la tabla, distancia en el eje Y de la tabla)   )
            self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
            self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
            self.verticalLayout.setContentsMargins(10, 0, 0, 0)
            self.verticalLayout.setObjectName("verticalLayout")
            
            # Redimensiona la SubVentana con el ancho de la Ventana y el alto del central Widget
            self.subWndDeflexiones.resize(ventanaPadre.geometry().width(),ventanaPadre.geometry().height())
            #self.subWndDeflexiones.show()
            self.subWndDeflexiones.showMaximized()
           
            # Se crea la tabla
            self.tblDeflexiones = QtWidgets.QTableWidget(self.verticalLayoutWidget)
    
            #Le da Formateo a la tabla
            self.fnFormatearTablaDeflexiones()
    
            #Carga datos a las deflexiones
            self.fnCargarDeflexiones()
    
            #Controlando el Evento click en la tabla 
            self.tblDeflexiones.cellDoubleClicked['int','int'].connect(self.tblDeflexiones_click) 
    
            # Luego se Agrega la tabla al layout
            self.verticalLayout.addWidget(self.tblDeflexiones)
    
            # Establece los textos de los botones
            self.pbInsertarDeflexiones.setText("Insertar")
            self.pbEditDeflexiones.setText("Editar")
            self.pbEliminarDeflexiones.setText("Eliminar")
            self.pbFiltrar.setText("Buscar")
            self.pbImprimirDeflexiones.setText("Imprimir")
            self.pbExportarDeflexiones.setText("Exportar")
            self.pbCerrarDeflexiones.setText("Cerrar")
            #self.tblDeflexiones.setSortingEnabled(True)  # no esta tevisar
    
        #Da formato a la tabla de deflexiones
        def fnFormatearTablaDeflexiones(self):
    
            # Objeto para la fuente
            font = QtGui.QFont()
            font.setFamily("Lucida Console")
            font.setPointSize(9)
    
            #Establece la fuente pafra toda la tabla
            self.tblDeflexiones.setFont(font)
            
            #Coloca el ToolTipo
            self.tblDeflexiones.setMaximumSize(QtCore.QSize(16777215, 16777215))  #
            self.tblDeflexiones.setLayoutDirection(QtCore.Qt.LeftToRight)      #
            self.tblDeflexiones.setAutoFillBackground(False)    # 
            self.tblDeflexiones.setDragDropOverwriteMode(True)   #
            self.tblDeflexiones.setTextElideMode(QtCore.Qt.ElideLeft) 
            self.tblDeflexiones.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerItem)
            self.tblDeflexiones.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerItem)
            self.tblDeflexiones.setShowGrid(True)
            self.tblDeflexiones.setGridStyle(QtCore.Qt.SolidLine)
            self.tblDeflexiones.setWordWrap(True)
            self.tblDeflexiones.setCornerButtonEnabled(True)
            self.tblDeflexiones.setRowCount(0)
            self.tblDeflexiones.setColumnCount(11)
            self.tblDeflexiones.setObjectName("tblDeflexiones")
            
            #crea y Coloca las columnas y centra
    
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(0, item)
                
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(1, item)
    
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(2, item)
                
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(3, item)
                
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(4, item)
                
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(5, item)
                
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(6, item)
                
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(7, item)
                
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(8, item)
                
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(9, item)
    
            item = QtWidgets.QTableWidgetItem()
            item.setTextAlignment(QtCore.Qt.AlignCenter)
            item.setForeground(QtGui.QColor(0,85,255))
            self.tblDeflexiones.setHorizontalHeaderItem(10, item)
                
    
            #otras caracteristicas        
            self.tblDeflexiones.horizontalHeader().setCascadingSectionResizes(False)
            self.tblDeflexiones.horizontalHeader().setDefaultSectionSize(75)
            self.tblDeflexiones.horizontalHeader().setHighlightSections(True)
            self.tblDeflexiones.horizontalHeader().setMinimumSectionSize(31)
            self.tblDeflexiones.verticalHeader().setDefaultSectionSize(25)
            self.tblDeflexiones.verticalHeader().setMinimumSectionSize(21)
            self.tblDeflexiones.verticalHeader().setSortIndicatorShown(False)  #
            self.tblDeflexiones.verticalHeader().setStretchLastSection(False)  #
            
            #El ancho de las columanas
            self.tblDeflexiones.setColumnWidth(INT_COL_ID,0)
            self.tblDeflexiones.setColumnWidth(INT_COL_PROGRESIVA,120) #120
            self.tblDeflexiones.setColumnWidth(INT_COL_CARGA,100) #100
            self.tblDeflexiones.setColumnWidth(INT_COL_D0,90)
            self.tblDeflexiones.setColumnWidth(INT_COL_D20,90)
            self.tblDeflexiones.setColumnWidth(INT_COL_D30,90)
            self.tblDeflexiones.setColumnWidth(INT_COL_D45,90)
            self.tblDeflexiones.setColumnWidth(INT_COL_D60,90)
            self.tblDeflexiones.setColumnWidth(INT_COL_D90,90)
            self.tblDeflexiones.setColumnWidth(INT_COL_D120,90)
            self.tblDeflexiones.setColumnWidth(INT_COL_D150,90)
    
            # Otras caracteristicas
            self.tblDeflexiones.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) # no permite la edicion en la fila
            self.tblDeflexiones.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)  #  que la seleccion sea single de fila en fila
            self.tblDeflexiones.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)  # que seleccione toda la fila del registro cuando se da clik
            
            #Agrega la tabla al layout
            self.verticalLayout.addWidget(self.tblDeflexiones)
            
            item = self.tblDeflexiones.horizontalHeaderItem(0)
            item.setText("ID")
            item = self.tblDeflexiones.horizontalHeaderItem(1)
            item.setText("Progresiva")
            item = self.tblDeflexiones.horizontalHeaderItem(2)
            item.setText("Carga(KN)")
            item = self.tblDeflexiones.horizontalHeaderItem(3)
            item.setText("D0(um)")
            item = self.tblDeflexiones.horizontalHeaderItem(4)
            item.setText("D20(um)")
            item = self.tblDeflexiones.horizontalHeaderItem(5)
            item.setText("D30(um)")
            item = self.tblDeflexiones.horizontalHeaderItem(6)
            item.setText("D45(um)")
            item = self.tblDeflexiones.horizontalHeaderItem(7)
            item.setText("D60(um)")
            item = self.tblDeflexiones.horizontalHeaderItem(8)
            item.setText("D90(um)")
            item = self.tblDeflexiones.horizontalHeaderItem(9)
            item.setText("D120(um)")
            item = self.tblDeflexiones.horizontalHeaderItem(10)
            item.setText("D150(um)")
    
    

  • Moderators

    Hola

    Abre la ventana como "modal", así no podrás pinchar en la ventana "padre" hasta que cierres la que has creado.

    Un saludo



  • @juanki hola pues he probado para el codigo accion Deflexiones con :

    self.subWndDeflexiones.setWindowModality(QtCore.Qt.WindowModal)

    o con esta otra.

    self.subWndDeflexiones.setWindowModality(QtCore.Qt.ApplicationModal)
    Y ninguno me dio resultado..


  • Moderators

    Hola

    La ventana hija que quieres abrir ¿hereda de QDialog o de QMainWindow?

    Si hereda de QDialog, es modal por defecto y tan solo tienes que abrirla, no sé como se hace en Python, es un lenguaje que no me gusta y lo desconozco, pero en C++ sería tan fácil como:

    TuDialog dialogo(this);
    dialogo.exec();
    

    Eso abrirá una ventana modal. Si hereda de QMainWindow sí hay que indicarle que sea modal:

    TuMainWindow *mainwindow = new TuMainWindow(this);
    mainwindow->setAttribute(Qt::WA_DeleteOnClose);
    mainwindow->setWindowModality(Qt::ApplicationModal);
    mainwindow->show();
    

    Cuando creo ventanas que serán modal, normalmente siempre heredo de QDialog.

    Un saludo


Log in to reply