1

我正在尝试使用 children() 方法访问嵌套的 QVBoxLayout 和 QHBoxLayout 布局中的所有按钮、标签、文本小部件等。但我没有得到我期望的结果:我只得到布局,而不是按钮、标签等。

是否有一种 Pythonic 方式来遍历所有嵌套布局以获取按钮、标签、文本编辑等?

这是我遇到麻烦的部分:

for child in self.ui.gridLayout.children():
    print "child_name:%s - type:%s" %(child.objectName(),type(child))

    for grand_child in child.children():
        print "gc_name:%s - type:%s" %(grand_child.objectName(),type(grand_child))

        # never prints the buttons, labels, etc
        for ggc in grand_child.children():
            print "ggc_name:%s - type:%s" %(ggc.objectName(),type(ggc)) 

        # never finds the QLabels
        qreg = QRegExp('.+')
        widgets = grand_child.findChildren(QLabel,qreg)
        print widgets # prints None

这是整个代码:

import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *

from mygui import Ui_Form


class MyApp(QtGui.QWidget):

    def __init__(self,parent=None):
        super(MyApp, self).__init__(parent)

        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.ui.pushButton_test.clicked.connect(self.click_button)

    def click_button(self):
        print "Printing layouts and widgets"

        for child in self.ui.gridLayout.children():
            print "child_name:%s - type:%s" %(child.objectName(),type(child))

            for grand_child in child.children():
                print "gc_name:%s - type:%s" %(grand_child.objectName(),type(grand_child))

                # never prints
                for ggc in grand_child.children():
                    print "ggc_name:%s - type:%s" %(ggc.objectName(),type(ggc)) 

                qreg = QRegExp('.+')
                widgets = grand_child.findChildren(QLabel,qreg)
                print widgets # prints None


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyApp()
    myapp.show()
    sys.exit(app.exec_())

这是mygui.py:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'mygui.ui'
#
# Created: Thu Mar 28 14:07:12 2013
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(454, 323)
        self.gridLayout = QtGui.QGridLayout(Form)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.verticalLayout = QtGui.QVBoxLayout()
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.lineEdit = QtGui.QLineEdit(Form)
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.horizontalLayout.addWidget(self.lineEdit)
        self.pushButton_2 = QtGui.QPushButton(Form)
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        self.horizontalLayout.addWidget(self.pushButton_2)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtGui.QHBoxLayout()
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.label_2 = QtGui.QLabel(Form)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.horizontalLayout_2.addWidget(self.label_2)
        self.label = QtGui.QLabel(Form)
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout_2.addWidget(self.label)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.textEdit = QtGui.QTextEdit(Form)
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.verticalLayout.addWidget(self.textEdit)
        self.pushButton_test = QtGui.QPushButton(Form)
        self.pushButton_test.setObjectName(_fromUtf8("pushButton_test"))
        self.verticalLayout.addWidget(self.pushButton_test)
        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton_2.setText(QtGui.QApplication.translate("Form", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setText(QtGui.QApplication.translate("Form", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Form", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton_test.setText(QtGui.QApplication.translate("Form", "Print All Widgets", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

感谢您的帮助和意见。

保罗

4

1 回答 1

2

我意识到所有的小部件都可以从 self 访问。这是我使用的最终代码:

wtypes = [QPushButton,QLabel,QTextEdit]
qreg = QRegExp(r'.*')
mywidgets = {}


for t in wtypes:
    mywidgets[t] = self.findChildren(t,qreg)

for button in mywidgets[QPushButton]:
    print "button:", button.objectName()

for label in mywidgets[QLabel]:
    print "label:", label.objectName()
于 2013-03-29T00:35:48.957 回答