我看过一些类似的答案,但似乎都没有解决我想解决的特定问题。 背景:我正在使用pyqt和QT Designer来设计我的布局。目前使用pyuic将布局转换为.py文件。 在这里我有一个QListView对象。
我想扩展QListView类,然后将这个特定实例复制到我的新类。
即。在我的ui.py文件中,我有:
self.taskList = QtGui.QListView(self.splitter)
...many other options
self.taskList.setObjectName(_fromUtf8("taskList"))
在我的mainfile.py中,我已经放了一个占位符,但是想象一下更多的方法
class MyTaskList(QtGui.QListView):
def __init__(self, arg):
super(self.__class__, self).__init__(arg)
self._saved_index = self.currentIndex()
@property
def saved_index(self):
return self._saved_index
@saved_index.setter
def saved_index(self, index):
if isinstance(index, QtCore.QModelIndex):
self._saved_index = index
def foo(self, thing):
#do something with thing and self
理想情况下,我想采用现有的taskList并复制所有属性。 即。
self.taskList = MyTaskList(self.taskList)
注意上面显然不会由于'arg',但是我尝试过类似的方法似乎没有复制所有实例属性,通过在init中使用各种形式的副本并将实例传递给MyNewClass即:
def __init__(self, obj):
super(self.__class__, self).__init__()
if isinstance(obj, QtGui.QListView
self.__dict__ = obj.__dict__.copy()
#or
self.__dict__.update(obj.__dict__)
其他成功但看起来很奇怪的选项包括使用类型模块和猴子补丁,如下所示:
import types
def foo(self, text):
print("my object name {} is {}".format(self.objectName(), text))
self.taskList.foo = types.MethodType(foo, self.taskList)
self.taskList.foo('dancing')
打印:
我的对象名称taskList正在跳舞
然而,由于我将有一些额外的功能和3或4个额外的变量,这似乎很麻烦。
那么,每次手动修改pyuic生成的文件时,我最好的方法是什么?我也可能想在我拥有的另一个QListView实例中使用许多这些方法。
编辑:有一种方法可以使用qt designer来标记@ekhumoro,我想这可以在我的特殊情况下工作(知道这个很棒,甚至没想过!)。但是,我怎样才能在任何课程中达到同样的目标?想象一下,在上面的情况下,ui.py不受我的控制。