理解PyQt4中的pyqtProperty

1 投票
1 回答
2220 浏览
提问于 2025-04-16 13:10

我写了一个小脚本来理解属性。现在我有一个疑问,我的类 AmetaObject() 里怎么会有一个叫 conf_name 的属性?我在类里只用过一次这个名字,作为设置属性时目标变量的名称。这个是怎么实现的呢?能不能用普通的 Python 来实现,也就是不使用 C API?

#!/usr/bin/python
from PyQt4.QtCore import QObject, pyqtProperty
from PyQt4.QtGui import QApplication

class A( QObject ):
    def __init__( self, parent = None ):
        QObject.__init__( self )
        self._name = ""

    def getName( self ):
        return self._name

    def setName( self, value ):
        self._name = value

    conf_name = pyqtProperty( "QString", getName, setName )

a = QApplication([])

ai = A()

for i in range( ai.metaObject().propertyCount() ):
    print ai.metaObject().property( i ).name()

1 个回答

0

如果这个东西不应该是你对象类的一个属性,那它应该放在这个类的 __init__ 函数里。你现在看到的是一个类属性,这个属性会被所有这个类型的对象继承,也就是说,所有从这个类派生出来的对象都会有这个属性。

这其实可以非常有用。比如说:

for PyQt4.QtCore import QThread
class My_Thread(QThread):
  all_instances = []
  def __del__(self, *args, **kwargs):
    all_instances.remove(self)
    QThread.__del__(self, *args, **kwargs)
  def __init__(self, *args, **kwargs):
    QThread.__init__(self, *args, **kwargs)
    my_locally_scoped_variable = None
    self.all_instances.append(self)

这个类创建了一个 QThread 的子类,它的接口完全一样。不过,如果我创建 thread = My_Thread(blahblahblah),我就可以通过查询 thread.all_instances 来获取所有这个类型的线程,甚至是它的任何子类的线程,像 thread.all_instances[-1].all_instances 这样。你需要注意的是,要处理对象的删除,否则每个类的实例都会一直存在引用,这样就不会被垃圾回收了。

另外要注意的是,my_locally_scoped_variable 只在 __init__ 的范围内存在,并不会创建一个属性。

撰写回答