在 pyqt 设计器中创建的对象上的 findChild
findChild on object created within pyqt designer
我的 pyqt 有以下问题:
假设我在 Qt Designer 中创建一个对象并将其保存为 .ui 文件。然后我使用 pyuic 将其转换为 .py 文件。因为我想将一个新模块集成到给定程序中,所以这是最喜欢的方式(因为稍后 .ui 文件将在启动时自动转换为 .py 文件)。
如果我查看我的 .py 文件,我会看到 window 的以下内容:
class Ui_SubWindow(object):
def setupUi(self, SubWindow):
SubWindow.setObjectName(_fromUtf8("SubWindow"))
....
我有一个 RemoteWindow
class 作为启动 SubWindow
的主窗口:
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:
class NewController(object):
def __init__(self, subwindow):
self.subwindow = subwindow
self.ui = subwindow.ui
我想在我的控制器上调用一个 .findChild() window
submitFrame = self.ui.findChild(QtGui.QFrame, "frameSubmit")
,但我得到的只是一个:
AttributeError: 'Ui_SubWindow' object has no attribute 'findChild'
我认为这是因为 class Ui_SubWindow
不是某个 QObject 的子对象 class,而是对象的子对象,对吗?
self.ui
与 subwindow.ui
相同,其中 subwindow
是 RemoteWindow
的一个实例,它具有 .ui
参数 Ui_SubWindow
Class.
有没有机会让 pyuic 或 Qt Designer 使这个 SubWindow 成为 QObject 的子窗口,没有 操作自动生成的 .py 文件?
Qt Designer 创建一个设计,即用于填充主小部件的 class,因此内部小部件不是此 class 的子部件,如果您想使用 findChild,则必须在调用方法 setupUi.
之后对 returns 这个 class 的小部件执行此操作
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 Designer 中定义的所有小部件创建属性。属性名称取自 objectName
。所以你只需要:
submitFrame = self.ui.frameSubmit
我最近不得不做同样的事情并把它留在这里以防有人看到这个 link 与另一个相关的。
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
我的 pyqt 有以下问题:
假设我在 Qt Designer 中创建一个对象并将其保存为 .ui 文件。然后我使用 pyuic 将其转换为 .py 文件。因为我想将一个新模块集成到给定程序中,所以这是最喜欢的方式(因为稍后 .ui 文件将在启动时自动转换为 .py 文件)。
如果我查看我的 .py 文件,我会看到 window 的以下内容:
class Ui_SubWindow(object):
def setupUi(self, SubWindow):
SubWindow.setObjectName(_fromUtf8("SubWindow"))
....
我有一个 RemoteWindow
class 作为启动 SubWindow
的主窗口:
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:
class NewController(object):
def __init__(self, subwindow):
self.subwindow = subwindow
self.ui = subwindow.ui
我想在我的控制器上调用一个 .findChild() window
submitFrame = self.ui.findChild(QtGui.QFrame, "frameSubmit")
,但我得到的只是一个:
AttributeError: 'Ui_SubWindow' object has no attribute 'findChild'
我认为这是因为 class Ui_SubWindow
不是某个 QObject 的子对象 class,而是对象的子对象,对吗?
self.ui
与 subwindow.ui
相同,其中 subwindow
是 RemoteWindow
的一个实例,它具有 .ui
参数 Ui_SubWindow
Class.
有没有机会让 pyuic 或 Qt Designer 使这个 SubWindow 成为 QObject 的子窗口,没有 操作自动生成的 .py 文件?
Qt Designer 创建一个设计,即用于填充主小部件的 class,因此内部小部件不是此 class 的子部件,如果您想使用 findChild,则必须在调用方法 setupUi.
之后对 returns 这个 class 的小部件执行此操作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 Designer 中定义的所有小部件创建属性。属性名称取自 objectName
。所以你只需要:
submitFrame = self.ui.frameSubmit
我最近不得不做同样的事情并把它留在这里以防有人看到这个 link 与另一个相关的。
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