在pyqt design中创建的对象上查找child

2024-05-13 21:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我的pyqt有以下问题:

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

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

class Ui_SubWindow(object):
    def setupUi(self, SubWindow):
        SubWindow.setObjectName(_fromUtf8("SubWindow"))
        ....

我有一个RemoteWindow类作为主窗口,在这里启动SubWindow

^{pr2}$

现在我有了一个核心计划:

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_SubWindow不是某个QObject的子类,而是一个object的子类,对吗?在

self.uisubwindow.ui相同,其中subwindowRemoteWindow的一个实例,该实例具有.ui参数Ui_SubWindow类。在

有没有机会让pyuic或Qt设计器使这个子窗口成为QObject的子窗口,而不操作自动生成的.py文件?在


Tags: 文件pyselfuiobjectinitdefqt
2条回答

您根本不需要使用findChild,因为pyuic将自动为Qt Designer中定义的所有小部件在ui对象中创建属性。属性名取自objectName。所以你只需要:

submitFrame = self.ui.frameSubmit

Qt Designer创建一个设计,即一个用于填充主窗口小部件的类,以便内部小部件不是该类的子级,如果要使用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
    [...]

然后你应该按照以下方式使用它:

^{pr2}$

相关问题 更多 >