Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Spanish
  4. Controlar una Subventana del Menu Bar
Forum Updated to NodeBB v4.3 + New Features

Controlar una Subventana del Menu Bar

Scheduled Pinned Locked Moved Unsolved Spanish
5 Posts 3 Posters 1.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    Leonardo6666
    wrote on last edited by
    #1

    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)")
    
    
    1 Reply Last reply
    0
    • juankiJ Offline
      juankiJ Offline
      juanki
      Moderators
      wrote on last edited by
      #2

      Hola

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

      Un saludo

      Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
      Procura escribir correctamente y sin faltas de ortografía.

      Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

      L 1 Reply Last reply
      0
      • juankiJ juanki

        Hola

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

        Un saludo

        L Offline
        L Offline
        Leonardo6666
        wrote on last edited by
        #3

        @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..

        1 Reply Last reply
        0
        • juankiJ Offline
          juankiJ Offline
          juanki
          Moderators
          wrote on last edited by juanki
          #4

          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

          Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
          Procura escribir correctamente y sin faltas de ortografía.

          Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

          1 Reply Last reply
          0
          • F Offline
            F Offline
            ffdnmc
            wrote on last edited by
            #5

            con la fucion subWindowList () puedes validar que ventanas tienes abiertas, por tanto con ella puedes controlar que no se abra mas de una vez una vetana

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved