qt - 如何动态创建Q_Properties

标签 qt properties pyqt pyside

我想从包含属性名称作为字符串的元组动态创建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/

相关文章:

python - pyqt 和请求 : Load an image into GUI

c++ - Qt构建为没有dll的单个exe文件

c++ - 离线 Qt 文档

c++ - 如何将制表符长度与Qt中的多个空格相匹配

c++ - libmysql.dll for 64bit Qt w/MSVS2017 compiler

java - 如何使用 BeanUtils.copyProperties?

c# - 如何在运行时的方法中立即更改标签文本?

java - 在 JSP 上使用 jSTL setBundle 从 jar 读取属性文件

python - PyQtGraph:为什么对象总是在左下角

python - 创建深度复制时尝试 pickle 未知类型