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:]
相反,如果您想要类似于 getattr
和 setattr
使用 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 获取器和设置器的主要内容,如果未能解决你的问题,请参考以下文章