簡體   English   中英

PyQt:以編程方式創建QT小部件

[英]PyQt: Creating QT Widgets Programmatically

有些時候需要創建盡可能多的小部件(例如QtGui.QLineEdit()),因為列表中有值(我們不知道列表變量中存儲了多少個值)。 我可以創建一個循環函數來運行多次,因為存儲在列表中的值...例如:

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

像這樣的方法的問題是,每個循環都聲明了相同的變量名。 稍后將無法訪問myLineEdit變量。 我聽說有些人使用eval()成功了嗎? 還是exec()? 功能。 看一個例子會很有趣。 如果有其他方法可以做到,請發布。 以下是開始時的示例代碼(如果您願意):

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

處理這種情況的一種簡單方法是使用列表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM