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

I realized that all the widgets can be accessed from self. Here is the final code I used:

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 に答える