usando PyQt, estoy tratando de crear una interfaz para la cual pueda agregar o eliminar widgets dinámicamente. Quiero definir una clase separada para el widget que se agregará o eliminará. Parece que no puedo obtener el widget que instauro para mostrar dentro de la interfaz principal. Aquí está el código que estoy utilizando:agregando y eliminando widgets dinámicamente en PyQt
from PyQt4 import QtGui, QtCore
import sys
class Main(QtGui.QMainWindow):
def __init__(self, parent = None):
super(Main, self).__init__(parent)
# central widget
self.centralWidget = QtGui.QWidget(self)
# main layout
self.vLayout = QtGui.QVBoxLayout(self.centralWidget)
# main button
self.pButton_add = QtGui.QPushButton(self.centralWidget)
self.pButton_add.setText('button to add other widgets')
# scroll area
self.scrollArea = QtGui.QScrollArea(self.centralWidget)
self.scrollArea.setWidgetResizable(True)
# scroll area widget contents
self.scrollAreaWidgetContents = QtGui.QWidget(self.scrollArea)
# scroll area widget contents - layout
self.formLayout = QtGui.QFormLayout(self.scrollAreaWidgetContents)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
# add all main to the main vLayout
self.vLayout.addWidget(self.pButton_add)
self.vLayout.addWidget(self.scrollArea)
# set central widget
self.setCentralWidget(self.centralWidget)
# connections
self.pButton_add.clicked.connect(self.addWidget)
def addWidget(self):
z = Test(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount()
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)
class Test(QtGui.QWidget):
def __init__(self, parent):
super(Test, self).__init__(parent)
self.pushButton = QtGui.QPushButton(self)
app = QtGui.QApplication(sys.argv)
myWidget = Main()
myWidget.show()
app.exec_()
la cosa es, cuando se utiliza el código de abajo en el interior de mi método de 'addWidget', que hace exactamente lo que yo quiero que haga, pero el método de la clase no parece que funciona
z = QtGui.QPushButton(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount())
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)
Me pregunto por qué z = Test() no está dando ningún resultado? ¿Algunas ideas? ¡Gracias!
¡Gracias por la respuesta detallada! La razón por la que estaba usando Form Layout fue porque quería que los widgets comenzaran a aparecer en la parte superior del área de desplazamiento y llene los lugares vacíos desde allí, en lugar de aparecer en el medio y reorganizarse a medida que se crean los nuevos widgets. Aunque estoy seguro de que hay otras formas de hacerlo, formlayout me pareció una solución fácil ... ¡Gracias de nuevo! – boundless
@boundless: Ah, ya veo. Mi acercamiento a eso sería envolviendo 'scrollLayout' en otro' QVBoxLayout' con un tramo de '1' añadido debajo de eso. Eso debería mantener las cosas en la parte superior. – Avaris
otra cosa que me gusta es la configuración, es más fácil tener dos widgets uno junto al otro y mantener las cosas en la parte superior ... Aunque tal vez en ese punto, debería usar el diseño de la cuadrícula. Gracias de nuevo por la pista! – boundless