pqt5 - qt designer python download
PyQt: cómo agregar un widget de IU separado a QMainWindow (3)
¿Estás buscando algo como esto? No estoy realmente seguro de cuál es tu main_widget
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
class MyMainWindow(QMainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.form_widget = FormWidget(self)
self.setCentralWidget(self.form_widget)
class FormWidget(QWidget):
def __init__(self, parent):
super(FormWidget, self).__init__(parent)
self.layout = QVBoxLayout(self)
self.button1 = QPushButton("Button 1")
self.layout.addWidget(self.button1)
self.button2 = QPushButton("Button 2")
self.layout.addWidget(self.button2)
self.setLayout(self.layout)
app = QApplication([])
foo = MyMainWindow()
foo.show()
sys.exit(app.exec_())
Solo recientemente he comenzado a programar y Python (PyQt) en particular. Tengo mi clase principal de QMainWindow
. Pero quería separarlo de los widgets de la interfaz de usuario, para que todas las cosas de Windows (menús, barras de herramientas, botones comunes) estén en QMainWindow
, pero todos los widgets específicos del programa / UI (botones de control, cuadros combinados, imágenes, casillas de verificación, etc.) estén en un QWidget
separado clase. Pero no estoy seguro de si estoy haciendo esto bien.
- Tengo un problema con los diseños: algo invisible está cubriendo los menús para que no se pueda hacer clic con el mouse. Creo que no estoy agregando mi widget de UI a la ventana principal correctamente
Así es como lo hago:
class MyMainWindow(QMainWindow):
def __init__(self, parent = None):
super(MyMainWindow, self).__init__(parent)
self.main_widget = QWidget(self)
...
self.form_widget = FormWidget(self)
#This is my UI widget
self.main_layout = QVBoxLayout(self.main_widget)
self.main_layout.sizeConstraint = QLayout.SetDefaultConstraint
self.main_layout.addWidget(self.form_widget.main_widget)
#form_widget has its own main_widget where I put all other widgets onto
self.main_widget.setLayout(self.main_layout)
self.setCentralWidget(self.main_widget)
- He visto otros programas de Python donde las aplicaciones se dividen en una gran cantidad de pequeños archivos de código (según tengo entendido, tener todo en la clase principal es ilegible o inmanejable).
¿Cuál es tu sugerencia acerca de dividir el código en partes pequeñas? ¿Cómo se hace mejor? ¿O para UI todo puede estar en un lugar grande? ¿Debo dividir el código / las clases de UI en un archivo separado?
Gracias.
[Solucionado]
Encontré mi error: eliminé el main_widget de la clase de widget de UI (ahora todos los widgets de UI están ubicados directamente en el widget de clase de UI) y solo hago esto:
self.main_layout.addWidget(self.form_widget)
No más problemas con los menús.
Recomendaría usar Qt Designer para crear la mayor cantidad de IU posible.
Le resultará mucho más fácil experimentar con diseños y demás de esa manera, y mantendrá automáticamente la mayoría de los elementos relacionados con la interfaz de usuario separados del resto de la lógica de su aplicación. Haga esto para la ventana principal, y también para cualquier cuadro de diálogo, aunque sea simple.
Luego use pyuic4
para compilar los módulos de Python de todos los archivos ui
, y pyuic4
en su propio subpaquete.
Recomendaría usar el indicador -w
al compilar archivos ui
. Esto generará una clase de interfaz de usuario de contenedor simple que puede ser subclasificada directamente.
Entonces tu ventana principal terminaría buscando algo como esto:
from ui.mainwindow import MainWindowUI
class MainWindow(MainWindowUI):
def __init__(self):
super(MainWindow, self).__init__()
# connect signals...
# do other setup stuff...
Tenga en cuenta que ahora se puede acceder directamente a todos los widgets agregados en Qt Designer como atributos de la instancia de MainWindow
.
No me preocuparía dividir su aplicación en módulos más pequeños hasta más adelante en el desarrollo. Puede que no sea necesario, pero si lo hace, será más obvio cómo hacerlo una vez que la aplicación comience a volverse más compleja.
No hay reglas duras y rápidas, cada proyecto es diferente.
import sys
from PyQt4 import QtCore, QtGui
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.form_widget = FormWidget(self)
_widget = QtGui.QWidget()
_layout = QtGui.QVBoxLayout(_widget)
_layout.addWidget(self.form_widget)
self.setCentralWidget(_widget)
class FormWidget(QtGui.QWidget):
def __init__(self, parent):
super(FormWidget, self).__init__(parent)
self.__controls()
self.__layout()
def __controls(self):
self.label = QtGui.QLabel("Name for backdrop")
self.txted = QtGui.QLineEdit()
self.lbled = QtGui.QLabel("Select a readNode")
self.cmbox = QtGui.QComboBox()
def __layout(self):
self.vbox = QtGui.QVBoxLayout()
self.hbox = QtGui.QHBoxLayout()
self.h2Box = QtGui.QHBoxLayout()
self.hbox.addWidget(self.label)
self.hbox.addWidget(self.txted)
self.h2Box.addWidget(self.lbled)
self.h2Box.addWidget(self.cmbox)
self.vbox.addLayout(self.hbox)
self.vbox.addLayout(self.h2Box)
self.setLayout(self.vbox)
def main():
app = QtGui.QApplication(sys.argv)
win = MainWindow()
win.show()
app.exec_()
if __name__ == ''__main__'':
sys.exit(main())
forma correcta !!!