Python 在pyqt设计器中创建的对象上的findChild
我的pyqt有以下问题: 假设我在Qt设计器中创建了一个对象,并将其保存为.ui文件。然后我使用pyuic将其转换为.py文件。因为我想将一个新模块集成到一个给定的程序中,所以这是我最喜欢的方式(因为稍后启动时,.ui文件将自动转换为.py文件) 如果查看我的.py文件,我会在窗口中看到以下内容: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
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