如何使用findChildren?

问题描述 投票:1回答:3

我想单击一个按钮并清除20个QLineEdits。

我正在尝试使用findChildren()并将所有QLineEdit放在QListWidget中

self.StudentAdmissionLayout = QGridLayout()
self.StudentAdmissionLayout.addWidget(self.StudentName,1,0,1,1)

self.StudentAdmissionLayout布局上已放置所有QLineEdit。

self.myList = QListWidget()
self.Item = QListWidgetItem()
self.Item = self.StudentAdmissionLayout.findChildren(QLineEdit)
self.myList.addItem(self.Item)

我遇到以下错误:

TypeError: arguments did not match any overloaded call:
QListWidget.addItem(QListWidgetItem): argument 1 has unexpected type 'list'
QListWidget.addItem(QString): argument 1 has unexpected type 'list'

我正在尝试将以上4行放在一个循环中。但是第三行不起作用,我不确定如何使它起作用。请提出建议。

python python-2.7 qt4 pyqt4
3个回答
6
投票

[确定,我们必须了解list-of-QObject QObject.findChildren (self, type type, QString name = QString())的行为。我已经参考了这堂课,它说;

返回此对象的所有子代,其给定名称可以是 强制类型转换为T,如果没有此类对象,则为空列表。 省略name参数会使所有对象名称匹配。的 搜索是递归执行的。

参考http://pyqt.sourceforge.net/Docs/PyQt4/qobject.html#findChildren

然后,它返回python list给您,列表中的元素是类型T(输入您的输入)。所以你有问题;

TypeError: arguments did not match any overloaded call:
QListWidget.addItem(QListWidgetItem): argument 1 has unexpected type 'list'
QListWidget.addItem(QString): argument 1 has unexpected type 'list'

该错误是因为您列出了零件,但实际上它只能是QListWidgetItemQString(或python string)。如果要分开,则必须使用“ for循环”来迭代数据;

myQListWidget = QListWidget()
listsItem = ['my', 'data', 'is', 'here', '!']
for item in listsItem:
    myQListWidget.addItem(item)

[我发现的另一个问题,您搜索的数据是QLineEditQListWidget.addItem()的重载方法中不支持类型。我认为您无法将其加入该方法。但是,如果仅需要QLineEdit中的“文本”。你可以做到这一点;

self.studentAdmissionQGridLayout = QGridLayout()
.
.
.
self.myQListWidget = QListWidget()
listsMyQLineEdit = self.studentAdmissionQGridLayout.findChildren(QLineEdit)
for myQLineEdit in listsMyQLineEdit:
    self.myQListWidget.addItem(myQLineEdit.text())

此参考了解QListWidget.addItem()

参考http://pyqt.sourceforge.net/Docs/PyQt4/qlistwidget.html#addItem


问候,


1
投票

如果行编辑没有作为父级的布局,则findChildren将找不到它们。

最好像这样遍历布局:

for row in range(layout.rowCount()):
    for column in range(layout.columnCount()):
        item = layout.itemAtPosition(row, column)
        if item is not None:
            widget = item.widget()
            if isinstance(widget, QLineEdit):
                listWidget.addItem(widget.text())

0
投票

所以我最终希望能够遍历加载的uic模块中的所有子对象并动态链接它们,并且此循环可能对您有帮助,仅对qlineedit进行一些轻微修改即可

for name, obj in dict(self.__dict__).items():
        # print(str(name) + str(obj))
        obj_type = str(obj).strip("<PyQt5").rsplit(" ")[0].replace(".", '', 1)
        # obj_type = str(obj).strip("<").rsplit(" ")[0]
        # print(obj_type)
        # obj_type = obj_str.strip("<PyQt5").rsplit(" ")[0].replace(".", '', 1)
        label_name = "self." + str(name)
        try:
            label_name = self.findChild(eval(obj_type), name)
            print(str(label_name) + ' created')
        except:
            pass
        if not isinstance(obj_type, QObject):
            continue

我曾经能够加载Qt Designer uic文件并连接自定义插槽和信号以及实时测试的存根的完整代码,位于下面

from PyQt5 import uic, QtWidgets
import sys
from PyQt5.QtCore import QObject

qtCreatorFile = "mainwindow.ui"  # Type your file path
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)


class build(Ui_MainWindow, QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

        for name, obj in dict(self.__dict__).items():
            # print(str(name) + str(obj))
            obj_type = str(obj).strip("<PyQt5").rsplit(" ")[0].replace(".", '', 1)
            # obj_type = str(obj).strip("<").rsplit(" ")[0]
            # print(obj_type)
            # obj_type = obj_str.strip("<PyQt5").rsplit(" ")[0].replace(".", '', 1)
            label_name = "self." + str(name)
            try:
                label_name = self.findChild(eval(obj_type), name)
                print(str(label_name) + ' created')
            except:
                pass
            if not isinstance(obj_type, QObject):
                continue


def start():
    app = QtWidgets.QApplication(sys.argv)
    bld = build()
    bld.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    start()
© www.soinside.com 2019 - 2024. All rights reserved.