【问题标题】:How to access dynamically generated QWidgets?如何访问动态生成的 QWidgets?
【发布时间】:2021-10-16 18:20:49
【问题描述】:

我有一个函数可以生成一个 QGroupBox,其中包含几个其他元素(按钮、LineEdits、复选框)。

def generate_whole_form(self, testbed) -> QGroupBox:

这个函数在循环中被调用,返回的QGroupBox被附加到一个数组(self.gridArray.append(current_groupbox))中,然后放入一个QGridLayout(self.gridlayout.append(current_groupbox))中。

我现在想访问 GroupBoxes 中的元素,我想有两种方法:

  1. 我的generate_whole_form() 不仅返回QGroupBox,还返回我以后需要处理的所有其他元素。然后我可以将这些句柄保存在循环中。
  2. 我可以这样做:self.gridArray[number].findChild(QWidget.QButton, "my_set_objectName") 来访问单个 UI 元素。

版本 2 似乎是更简单的选择,因为我不需要管理所有返回的 UI 对象。事实上,我已经开始以这种方式实现它,但由于某种原因,每当我调用findChild() 时,我的程序就会中断。但是,当我使用 findChildren() 时,它可以正常工作。

我想知道上述方法中的一种是否比另一种更好,或者是否还有第三种方法。如果首选版本二,当我使用findChild() 时出了什么问题?如何正确使用该功能?

【问题讨论】:

  • 您应该说明您实际上需要访问什么以及如何/何时/为什么。此外,如果findChild 的语法完全与您编写的一样,您的程序将由于语法错误而崩溃:它应该是findChild(QtWidgets.QPushButton, "my_set_objectName"),因为QWidget 不是模块,并且没有QButton 这样的东西。此外,您应该考虑到 python 列表是不是数组:数组是相同类型的项目的集合。
  • 如果您确保所有子小部件都有唯一的名称(即相对于它们的父组框),那么您可以使用self.gridArray[number].findChild(object, name)

标签: python pyqt


【解决方案1】:

一个更简单的解决方案是创建一个 QGroupBox,其中包含小部件:

class CustomGroupBox(QGroupBox):
    def __init__(self, params, parent=None):
        super().__init__(parent)
        self._widgets = dict()
 
        for param in params:
            # TODO: create widget using param
            widget = QWidget() 
            # TODO: add layout
            self.widgets[custom_key] = widget

    @property
    def widgets(self):
        return self._widgets

然后:

group_box = CustomGroupBox(...)
print(group_box.widgets)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多