【问题标题】:PyQt: Creating QT Widgets ProgrammaticallyPyQt:以编程方式创建 QT 小部件
【发布时间】:2014-03-06 00:25:00
【问题描述】:

有时需要创建与列表中的值一样多的小部件(例如 QtGui.QLineEdit() )(我们不知道列表变量中存储了多少值)。 我可以创建一个循环函数,使其运行次数与列表中存储的值一样多……例如:

for each in myList:
    myLineEdit = QtGui.QLineEdit("myLineEdit")

这种方法的问题在于,每个循环都声明了相同的变量名。以后将无法访问 myLineEdit 变量。 我听说有些人使用 eval() 取得了成功?还是执行()?功能。看一个例子会很有趣。如果有其他方法,请张贴。以下是开始的示例代码(如果您愿意的话):

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_())

另一个例子:

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_())

【问题讨论】:

    标签: python widget pyqt qtcore


    【解决方案1】:

    处理这种情况的一种简单方法是使用列表:

    lineEdits = []
    for _ in range(5):
        myLineEdit = QtGui.QLineEdit("myLineEdit")
        lineEdits.append(myLineEdit)
    
    myLayout = QtGui.QHBoxLayout()
    for lineEdit in lineEdits:
        myLayout.addWidget(lineEdit)
    

    如果您以后想通过键引用小部件,您也可以使用字典:

    lineEdits = {}
    for i in range(5):
        myLineEdit = QtGui.QLineEdit("myLineEdit")
        lineEdits[i] = myLineEdit
    
    lineEdits[3].setText("My new text")
    

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多