python - español - PyQt: Creación de widgets QT mediante programación
qt creator python (1)
Hay momentos en los que es necesario crear tantos widgets (como QtGui.QLineEdit ()) como valores en una lista (no sabemos cuántos valores se almacenan en una variable de lista). Podría crear una función de bucle que se ejecutará tantas veces como valores almacenados en una lista ... como:
for each in myList:
myLineEdit = QtGui.QLineEdit("myLineEdit")
El problema con un enfoque como este es que con cada ciclo se declara el mismo nombre de variable. No habrá forma de acceder a la variable myLineEdit más adelante. He oído que algunos tienen éxito usando eval ()? o ejecutivo ()? función. Sería interesante ver un ejemplo. Si hay otra manera de hacerlo, publíquelo. Aquí está el código de ejemplo para comenzar (si lo desea):
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication(sys.argv)
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
mainQWidget = QtGui.QWidget()
mainLayout=QtGui.QVBoxLayout()
for i in range(5):
exec( ''myGroupBox''+str(i)+''= QtGui.QGroupBox() '' )
exec( ''myLayout''+str(i)+'' = QtGui.QHBoxLayout()'' )
exec( ''label''+str(i)+''=QtGui.QLabel("Name ''+str(i)+'': ")'' )
exec( ''self.myLineEdit''+str(i)+''=QtGui.QLineEdit()'' )
exec( ''myLayout''+str(i)+''.addWidget(label''+str(i)+'')'' )
exec( ''myLayout''+str(i)+''.addWidget(self.myLineEdit''+str(i)+'', QtCore.Qt.AlignRight)'' )
exec( ''myGroupBox''+str(i)+''.setLayout(myLayout''+str(i)+'')'' )
exec( ''mainLayout.addWidget(myGroupBox''+str(i)+'')'' )
mainQWidget.setLayout(mainLayout)
self.setCentralWidget(mainQWidget)
window = MainWindow()
window.show()
window.resize(480,320)
sys.exit(app.exec_())
OTRO EJEMPLO:
from PyQt4 import QtCore, QtGui
import random
app = QtGui.QApplication(sys.argv)
class MainWindow(QtGui.QMainWindow):
def __init__(self, argList):
super(MainWindow, self).__init__()
self.argList=argList
mainQWidget = QtGui.QWidget()
mainLayout=QtGui.QVBoxLayout()
for i in range(len(self.argList)):
exec( ''myGroupBox''+str(i)+''= QtGui.QGroupBox() '' )
exec( ''myLayout''+str(i)+'' = QtGui.QHBoxLayout()'' )
exec( ''label''+str(i)+''=QtGui.QLabel("Name ''+str(self.argList[i])+'': ")'' )
exec( ''label''+str(i)+''.setFixedWidth(100)'' )
exec( ''self.myLineEdit''+str(i)+''=QtGui.QLineEdit()'' )
exec( ''self.myLineEdit''+str(i)+''.setText("''+str(random.random())+''")'' )
exec( ''myLayout''+str(i)+''.addWidget(label''+str(i)+'')'' )
exec( ''myLayout''+str(i)+''.addWidget(self.myLineEdit''+str(i)+'', QtCore.Qt.AlignRight)'' )
exec( ''myGroupBox''+str(i)+''.setLayout(myLayout''+str(i)+'')'' )
exec( ''mainLayout.addWidget(myGroupBox''+str(i)+'')'' )
ButtonBox = QtGui.QGroupBox()
ButtonsLayout = QtGui.QHBoxLayout()
Button_01 = QtGui.QPushButton("Close")
Button_01.clicked.connect(self.close)
Button_02 = QtGui.QPushButton("Print")
Button_02.clicked.connect(self.printOut)
ButtonsLayout.addWidget(Button_01)
ButtonsLayout.addWidget(Button_02)
ButtonBox.setLayout(ButtonsLayout)
mainLayout.addWidget(ButtonBox)
mainQWidget.setLayout(mainLayout)
self.setCentralWidget(mainQWidget)
def printOut(self):
for i in range(len(self.argList)):
exec( ''print self.myLineEdit''+str(i)+''.text()'' )
def close(self):
sys.exit()
myList=[''One'',''Two'',''Tree'',''Four'',''Five'',''Six'',''Seven'']
window = MainWindow(myList)
window.show()
window.resize(480,320)
sys.exit(app.exec_())
Una manera fácil de manejar esta situación es usar una lista:
lineEdits = []
for _ in range(5):
myLineEdit = QtGui.QLineEdit("myLineEdit")
lineEdits.append(myLineEdit)
myLayout = QtGui.QHBoxLayout()
for lineEdit in lineEdits:
myLayout.addWidget(lineEdit)
Alternativamente, podría usar un diccionario, si luego quisiera hacer referencia a un widget con una clave:
lineEdits = {}
for i in range(5):
myLineEdit = QtGui.QLineEdit("myLineEdit")
lineEdits[i] = myLineEdit
lineEdits[3].setText("My new text")