我正在制作一个小应用程序,在弄清楚如何实现这一部分时遇到了麻烦。原则上,这里的问题是我需要向类添加一个方法。但是,该类的实例是通过另一个类中的方法生成的。因此,我不清楚如何在不创建第二个类的子类的情况下实现子类。
更具体地说,这两个类是:PlotItem 和 GraphicsLayoutWidget(来自 pyqtgraph 的类 - 缩写如下 pg(。
因此,在我的应用程序中,我有:
self.plotWidget = pg.GraphicsLayoutWidget
PlotItem 类的实例是通过从 GraphicsLayoutWidget 调用 addPlot(( 方法生成的。即:
plt = self.plotWidget.addPlot(*args)
问题是我需要向 PlotItem 类添加一个方法,我计划通过子类化来做到这一点。但是,我不知道如何在不子类化GraphicsLayoutWidget的情况下生成实例。
这是最好的解决方案吗?我已经读过一些关于将该方法修补到 PlotItem 类中的信息,但我通常不熟悉这种方法(对所有这些方法来说相对较新(。
如果相关,(简化的(子类定义:
class MyPlotItem(PlotItem):
def paint(self, painter, *args):
painter.setPen(...)
painter.drawRect(self.boundingRect())
PlotItem.paint(self, painter, *args)
你可以给你的类添加一个新的构造函数,从PlotItem
创建一个MyPlotItem
实例,例如:
class MyPlotItem(PlotItem):
@classmethod
def from_plotitem(cls, plotitem):
return cls(plotitem.parent, plotitem.name, ...)
def paint(self, painter, *args):
painter.setPen(...)
painter.drawRect(self.boundingRect())
PlotItem.paint(self, painter, *args)
然后,您可以替换:
plt = self.plotWidget.addPlot(*args)
跟:
plt = MyPlotItem.from_plotitem(self.plotWidget.addPlot(*args))
并具有具有所需方法的实例。
我最近遇到了类似的问题,我想对PlotItem
进行子类化,以便在单击信号时触发信号。
我不必子类化GraphicsLayoutWidget
然后使用addPlot()
而是利用GraphicsLayoutWidget
的addItem()
函数,如下所示:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import pyqtgraph as pg
import sys
class myPlotItem(pg.PlotItem):
clicked = pyqtSignal(QObject)
def __init__(self, parent = None):
super(myPlotItem, self).__init__(parent)
def mousePressEvent(self, ev):
super(myPlotItem, self).mousePressEvent(ev)
self.clicked.emit(self)
def on_click(plot):
print 'clicked! ' + str(plot)
app = QApplication([])
figure = pg.GraphicsLayoutWidget()
plot = myPlotItem()
plot.clicked.connect(on_click)
figure.addItem(plot)
figure.show()
sys.exit(app.exec_())
这很好用,因为一旦创建了PlotItem
addPlot()
它本身就会以相同的方式调用addItem()
:
http://www.pyqtgraph.org/documentation/_modules/pyqtgraph/graphicsItems/GraphicsLayout.html#GraphicsLayout.addPlot