tutorial español creator python widget pyqt qtcore

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