我需要将数据对象(类实例)连接到没有setData()方法的QLabel
小部件。有没有办法扩展QLabel以便它支持数据附加?
答案 0 :(得分:1)
您是否尝试将数据分配给属性?
In [2]: from PyQt4 import QtCore, QtGui
In [3]: import sys
In [4]: app = QtGui.QApplication(sys.argv)
In [5]: label = QtGui.QLabel('Test')
In [6]: label.answer = 42
In [7]: label.answer
Out[7]: 42
答案 1 :(得分:1)
我建议继承。虽然@BlackJack的答案会起作用,但是当你打开自己的问题时,它通常被认为是“鸭拳”/“猴子补丁”的不良形式。来自wikipedia
粗心写作或记录不佳的猴子补丁可能会导致问题:
当修补程序对已修补对象的假设不再成立时,它们可能导致升级问题;如果您更改的产品随新版本发生变化,则很可能会破坏您的补丁。出于这个原因,猴子补丁通常是有条件的,只有在适当的情况下才适用。
如果两个模块尝试使用相同的方法进行修补,其中一个模块(无论哪个运行最后一个)“获胜”而另一个补丁无效,除非猴子补丁使用alias_method_chain这样的模式编写。
它们会在磁盘上的原始源代码与观察到的行为之间产生差异,这些行为可能会让任何不知道补丁存在的人感到非常困惑。
即使没有使用猴子补丁,有些人也会看到该功能的可用性问题,因为在编程语言中使用猴子补丁的能力与执行强封装是不兼容的,正如对象能力模型所要求的那样,对象之间。
因此,子类化是首选方法。像这样的东西,例如:
class MyLabel(QLabel):
def __init__(self, *args, **kwargs):
QLabel.__init__(self, *args, **kwargs)
self._data = None
def data(self):
return self._data
def setData(self, data):
self._data = data
然后匹配其他类的Qt语法。
您还可以扩展它以支持存储多个角色的数据(如其他一些Qt类)
class MyLabel(QLabel):
def __init__(self, *args, **kwargs):
QLabel.__init__(self, *args, **kwargs)
self._data = {}
def data(self, role = Qt.DisplayRole):
if role in self._data:
return self._data[role]
return None
def setData(self, data, role = Qt.DisplayRole):
self._data[role] = data
显然这仅供Python代码使用(Qt不会使用它)。
答案 2 :(得分:0)
您可以使用动态setProperty方法在Qt对象中隐藏额外的信息。
self.myqlabel.setProperty("answer", 42)
然后使用属性方法稍后检索信息:
value = self.myqlabel.property("answer")
此技术的另一个优点是。您可以存储多条数据,只需将属性字符串更改为所需的任何内容即可:
self.myqlabel.setProperty("name", "bruno mars")
不确定,但这可能是Qt5功能吗?