如何将数据对象设置为没有setData()方法的窗口小部件

时间:2014-07-13 18:06:10

标签: python pyqt

我需要将数据对象(类实例)连接到没有setData()方法的QLabel小部件。有没有办法扩展QLabel以便它支持数据附加?

3 个答案:

答案 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功能吗?