PyQt5 获取器和设置器

Posted

技术标签:

【中文标题】PyQt5 获取器和设置器【英文标题】:PyQt5 Getters and Setters 【发布时间】:2018-11-19 16:27:54 【问题描述】:

为了给自己提供一种在 python 中绑定的方法,我有以下代码:

wname = QLineEdit()
dname = "Test Value"
sattr  = getattr(wname, "text")

如何使用上面的信息将 dname 的值分配给 wname?

我明白这里通常会使用 setText();但是,我正在探索一种绑定方法,我想知道如何利用 getattr() 函数来提取传递的小部件的 setter 和 getter。谢谢!!!

【问题讨论】:

setattr(wname, 'text', dname)getattr(wname, 'setText')(dname)。只有当属性是 qt property 时,前者才真正有意义。 pyqt 是用 C++ 编写的,它不使用 property,因此无法像您想的那样获得 getter 和 setter,正如 ekhumoro 指出的那样,接近您想要的东西是使用 q-properties 也许我应该澄清一下我将使用 Qt 小部件进行绑定。 @Elcid_91 不会改变任何东西,Qt 小部件是 QObject,你也有 q-properties @Elcid_91 一个可能的选择是继承小部件并建立这些属性。 【参考方案1】:

不确定我是否明白了这一点,但通过这样做

sattr = getattr(wname, "text")

您正在检索函数而不是其中的文本。因此通过调用

sattr("abc")

您将设置文本。写作也一样:

sattr = gettar(wname, "setText")
sattr("Hello World!")

【讨论】:

是的,我正在尝试接收函数,然后利用检索到的函数来设置值。会有不同的小部件,我需要检索它们各自的 setter 和 getter 方法。【参考方案2】:

与 Alessandro 所说的类似,您需要先使用 getattr 获取 setter,然后使用您的文本调用它:

wname = QLineEdit()
dname = "Test Value"
sattr = getattr(wname, "setText")
sattr(dname)

如果你想构建一些基于属性名称同时获取 getter 和 setter 的代码,我想你可以这样做:

def get_getters_and_setters(widget, name):
    return getattr(widget, name), getattr(widget, 'set' + name[0].upper() + name[1:]

相反,如果您想要类似于 getattrsetattr 使用 Python 属性的方式,但对于已经存在的小部件属性,我想您可以执行以下操作,但这似乎有点矫枉过正对我来说:

class CustomLineEdit(QtWidgets.QLineEdit):

    @property
    def textAttribute(self):
        return self.text()

    @textAttribute.setter
    def textAttribute(self, value):
        self.setText(value)

wname = CustomLineEdit()
dname = "Test Value"
setattr(wname, 'textAttribute', dname)

【讨论】:

以上是关于PyQt5 获取器和设置器的主要内容,如果未能解决你的问题,请参考以下文章

属性获取器和设置器

用于获取器和设置器的 Google 样式指南属性

Javascript:对象设置器和获取器在克隆/复制/扩展后丢失

jQuery----奇偶选择器和索引选择器

MongoDB 分片、仲裁器和集群设置

选择器和层叠