qt - 如何动态创建Q_Properties

我想从包含属性名称作为字符串的元组动态创建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 创建一个新类.然后可以将这个新类的实例用作从样式表收集信息的代理。

https://stackoverflow.com/questions/22116670/

相关文章:

database-design - Toad ERD 到 Visio ER 图的转换

Django - 如何设置表单字段占位符的样式?

asp.net-mvc - MVC 层和 DAL 和数据层

localization - 在运行时更改 WIX 安装程序语言

jdbc - 在 Netty 消息处理中使用 JDBC 事务

command-line - 无法在 cygwin 上运行 isql

ruby-on-rails - 在 rails 开发环境 smtp cpanel 上发送电子邮件 r

arrays - 简单数组追加操作的时间复杂度

Django 1.6 - 如何将显示的文本缩短到模板中?

math - 最大化受二次约束的线性目标