usando PyQt, sto cercando di creare un'interfaccia per la quale posso aggiungere o rimuovere widget in modo dinamico. Voglio definire una classe separata per il widget che verrà aggiunto o rimosso. Non riesco a essere in grado di ottenere il widget che istanziato per visualizzare all'interno dell'interfaccia principale. Ecco il codice che sto usando:aggiungendo e rimuovendo dinamicamente i widget in 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 è, quando uso il codice qui sotto dentro il mio metodo 'addWidget', che fa esattamente quello che voglio fare, ma il metodo di classe non lo fa sembra funzionare.
z = QtGui.QPushButton(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount())
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)
Mi chiedo perché z = Test() non sta dando alcun risultato? Qualche idea? Grazie!
Grazie per la risposta dettagliata! Il motivo per cui stavo usando il layout del modulo era che volevo che i widget iniziassero a comparire nella parte superiore dell'area di scorrimento e riempire i posti vuoti da lì, invece di apparire al centro e riorganizzarsi quando vengono creati i nuovi widget. Anche se sono sicuro che ci sono altri modi per farlo, formlayout mi è sembrato una soluzione facile per me .. Grazie ancora! – boundless
@boundless: Ah, capisco. Il mio approccio sarebbe quello di avvolgere 'scrollLayout' in un altro' QVBoxLayout' con un tratto di '1' aggiunto sotto. Questo dovrebbe mantenere le cose al top. – Avaris
un'altra cosa che mi piace per la creazione di form, è che rende più facile avere due widget l'uno accanto all'altro, pur mantenendo le cose al top .. Anche se forse a quel punto, dovrei semplicemente usare il layout della griglia. Grazie ancora per il suggerimento! – boundless