如何访问动态生成的 QWidgets?

How to access dynamically generated QWidgets?

我有一个生成 QGroupBox 的函数,里面有几个其他元素(按钮、LineEdits、复选框)。

def generate_whole_form(self, testbed) -> QGroupBox:

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

我现在想访问 GroupBox 中的元素,我想有两种方法可以做到:

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

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

时它工作正常

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

一个更简单的解决方案是创建一个拥有小部件的 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)