Python 在pyqt设计器中创建的对象上的findChild

Python 在pyqt设计器中创建的对象上的findChild,python,qt,pyqt,pyqt4,Python,Qt,Pyqt,Pyqt4,我的pyqt有以下问题: 假设我在Qt设计器中创建了一个对象,并将其保存为.ui文件。然后我使用pyuic将其转换为.py文件。因为我想将一个新模块集成到一个给定的程序中,所以这是我最喜欢的方式(因为稍后启动时,.ui文件将自动转换为.py文件) 如果查看我的.py文件,我会在窗口中看到以下内容: class Ui_SubWindow(object): def setupUi(self, SubWindow): SubWindow.setObjectName(_fromU

我的pyqt有以下问题:

假设我在Qt设计器中创建了一个对象,并将其保存为.ui文件。然后我使用pyuic将其转换为.py文件。因为我想将一个新模块集成到一个给定的程序中,所以这是我最喜欢的方式(因为稍后启动时,.ui文件将自动转换为.py文件)

如果查看我的.py文件,我会在窗口中看到以下内容:

class Ui_SubWindow(object):
    def setupUi(self, SubWindow):
        SubWindow.setObjectName(_fromUtf8("SubWindow"))
        ....
我有一个
RemoteWindow
类作为主窗口,在主窗口中启动
子窗口

class RemoteWindow(QtGui.QMainWindow):
  def __init__(self, subcore):
    super(RemoteWindow, self).__init__(subcore.core.gui)
    self.subcore = subcore
    self.ui = Ui_SubWindow()
现在我有一个核心计划:

class SubCore(object):
  def __init__(self, core, identity, number):
    ...
    self.gui = RemoteWindow(self)
    self.newController = NewController(self.gui)
以及新的控制器类:

class NewController(object):
  def __init__(self, subwindow):
    self.subwindow = subwindow
    self.ui = subwindow.ui
我想从控制器中调用该窗口上的.findChild()

submitFrame = self.ui.findChild(QtGui.QFrame, "frameSubmit")
,但我得到的只是:

AttributeError: 'Ui_SubWindow' object has no attribute 'findChild'
我假设这是,因为类
Ui\u子窗口
不是某个QObject的子类,而是某个对象的子类,对吗

self.ui
subwindow.ui
相同,其中
subwindow
RemoteWindow
的一个实例,它具有as
.ui
参数
ui\u subwindow


有没有可能让pyuic或Qt设计器在不操作自动生成的.py文件的情况下,使此子窗口成为QObject的子窗口?Qt设计器创建一个设计,即一个用于填充主小部件的类,以便内部小部件不是此类的子窗口,如果要使用findChild,必须在调用setupUi方法后对返回此类的小部件执行此操作

class RemoteWindow(QtGui.QMainWindow):
  def __init__(self, subcore):
    super(RemoteWindow, self).__init__(subcore.core.gui)
    self.subcore = subcore
    self.ui = Ui_SubWindow()
    self.ui.setupUi(self) # Here the widget is filled
    [...]
然后你应该按照以下方式使用它:

class NewController(object):
  def __init__(self, subwindow):
    self.subwindow = subwindow
    submitFrame = self.subwindow.findChild(QtGui.QFrame, "frameSubmit")
    [...]

您根本不需要使用
findChild
,因为pyuic将在
ui
对象中为Qt设计器中定义的所有小部件自动创建属性。属性名称取自
objectName
。因此,您所需要的是:

submitFrame = self.ui.frameSubmit

我最近不得不做同样的事情,把这个留在这里,以防有人看到这个链接和另一个相关的链接。

对于名称,在dict(self.\u dict.\uu.items()中的对象:
#打印(str(姓名)+str(obj))

obj_type=str(obj).strip(“我想使用findChild,因为我以后会动态地添加项(使用for循环,所以1到n个对象,可通过名称“element_”+str(I)识别)并希望通过对象访问它们name@fighter-ii.您的问题特别询问了在Qt Designer中创建的小部件。为此,我给出的解决方案是目前为止最好的。它适用于所有对象,而不仅仅是
QObject
的子类;它不要求对象有父对象;即使它们有父对象,也没有必要了解父项是什么。这就是为什么pyuic设计成这样工作。对于动态生成的小部件,最好使用列表:即
self.ui.element[i]
findChild
方法有它的用途,但它不是一个好的通用解决方案。感谢您的输入。事实上,我只是在动态生成的输入周围包装了一个框架(并在Qt Designer中添加了此框架),因此,现在我可以访问/删除整个框架,并可以在需要时手动构建它。我选择您的答案作为接受答案,因为在self.subwindow而不是self.ui上调用findChild就成功了。谢谢!
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