我想从包含属性名称作为字符串的元组动态创建Q_Properties
。
以下非动态代码有效:
class MyObject(QObject):
def __init__(self,startval=42):
self.ppval = startval
def readPP(self):
return self.ppval
def setPP(self,val):
self.ppval = val
pp = QtCore.Property(int, readPP, setPP)
我的第一次尝试是使用 setProperty
函数,但它返回 False
,这意味着该属性没有添加到 staticMetaObject
中,因此对于 Qt 的样式表不可见。
class MyObject(QWidget):
def __init__(self,startval=42):
self.ppval = startval
print(self.setProperty('pp', QtCore.Property(int, self.readPP, self.setPP)))
def readPP(self):
return self.ppval
def setPP(self,val):
self.ppval = val
另一种方法是使用 setAttr
。但同样未能将属性添加到 staticMetaObject
。
class MyObject(QWidget):
def __init__(self,startval=42):
self.ppval = startval
setattr(self, 'pp', QtCore.Property(int, self.readPP, self.setPP)
def readPP(self):
return self.ppval
def setPP(self,val):
self.ppval = val
到目前为止,我还没有找到手动向 staticMetaObject
添加内容的方法。
最佳答案
我要在这里伸出我的脖子说我认为不可能做到这一点。元对象在 python 类语句的执行过程中动态创建,因此之后无法向其添加任何内容。
您可以在类构造完成后尝试以下操作:
MyObject.pp = QtCore.Property(int, MyObject.readPP, MyObject.setPP)
它将作为一个普通的 python 属性运行:
obj = MyObject()
print(obj.pp) # prints "42"
但它不会被列为元属性:
meta = obj.metaObject()
for index in range(meta.propertyCount()):
print('meta: %s' % meta.property(index).name())
# only prints "meta: objectName"
setProperty方法在这里没有用,因为虽然它可以用来设置现有元属性的值,但以这种方式创建的任何新属性本身不会成为元属性特性。相反,它们将成为动态 属性,可以通过 qss 读取但不能设置。只有元属性可以是 set via qss .
所以看起来动态创建元属性的唯一方法是使用 type 创建一个新类.然后可以将这个新类的实例用作从样式表收集信息的代理。
关于qt - 如何动态创建Q_Properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22116670/