-
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)")
-
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.. -
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