我正在PyQwt中创建一个奈奎斯特图。它目前有效,除了我需要翻转y轴 - 约定在底部为零,并在你上升时增加负数。
我知道你将如何在C ++中做到这一点,但无法弄清楚如何在Python中做到这一点。我不完全理解Qt / Qwt如何转换为PyQt / PyQwt。根据{{3}},要设置属性Inverted
。在C ++中,这看起来像:
ui.plotWidget->axisScaleEngine(QwtPlot::yLeft)->setAttribute(QwtScaleEngine::Inverted, true);
我无法想办法做到这一点,我在主窗口__init__(self)
尝试了几种方法:
self.ui.qwtPlot.setAxisTitle(Qwt.QwtPlot.yLeft, 'Imaginary Impedance')
self.ui.qwtPlot.setAxisScaleEngine(Qwt.QwtPlot.yLeft, Qwt.QwtScaleEngine.Inverted))
# TypeError: QwtPlot.setAxisScaleEngine(): argument 2 has unexpected type 'Attribute'
self.ui.qwtPlot.setAxisScaleEngine(Qwt.QwtPlot.yLeft, Qwt.QwtScaleEngine.setAttribute(Inverted))
# NameError: global name 'Inverted' is not defined
self.ui.qwtPlot.setAxisScaleEngine(Qwt.QwtPlot.yLeft, Qwt.QwtScaleEngine.setAttribute(Qwt.QwtScaleEngine.Inverted)
# TypeError: QwtScaleEngine.setAttribute(): first argument of unbound method must have type 'QwtScaleEngine'
我也尝试定义一个新类,就像在http://qwt.sourceforge.net/class_qwt_scale_engine.html中一样,如:
class InvertedAxisEngine(Qwt.QwtScaleEngine):
def __init__(self):
Qwt.QwtScaleEngine.__init__(self)
self.setAttribute(Qwt.QwtScaleEngine.Inverted)
# back in Window.__init__(self)
self.ui.qwtPlot.setAxisScaleEngine(Qwt.QwtPlot.yLeft, InvertedAxisEngine)
#TypeError: QwtPlot.setAxisScaleEngine(): argument 2 has unexpected type 'PyQt4.QtCore.pyqtWrapperType'
self.ui.qwtPlot.setAxisScaleEngine(Qwt.QwtPlot.yLeft, InvertedAxisEngine())
# NotImplementedError: QwtScaleEngine.divideScale() is abstract and must be overridden
#NotImplementedError: QwtScaleEngine.transformation() is abstract and must be overridden
我觉得我让这太复杂了。
编辑 - 以下评论启发了一些方面,例如将=True
添加到Inverted
(不,没有关键字参数,我也尝试了这个,这对unexpected type
有用(包装)。
self.ui.inverted_engine = Qwt.QwtScaleEngine
self.ui.inverted_engine.Inverted = True
self.ui.qwtPlot.setAxisScaleEngine(Qwt.QwtPlot.yLeft, self.ui.inverted_engine)
GUI运行时没有解释器提示访问权限,但是我向init添加了print dir(Qwt.QwtScaleEngine)
,它确实存在:['Attribute', 'Floating', 'IncludeReference', 'Inverted', 'NoAttribute', 'Symmetric', '__class__',....
答案 0 :(得分:1)
我在http://orange.biolab.si/svn/orange/externals/trunk/install-scripts/mac/bundle/Orange.app/Contents/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/PyQt4/Qwt5/qplt.py检查代码后终于弄明白了。我认为可能还有一种方法可以使用setAxisScaleEngine()
来实现这一点,但这很有效。
QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.qwtPlot.setAxisTitle(Qwt.QwtPlot.yLeft, 'Imaginary Impedance (ohms)')
self.ui.qwtPlot.setCanvasBackground(Qt.white)
engine = self.ui.qwtPlot.axisScaleEngine(Qwt.QwtPlot.yLeft)
Qwt.QwtScaleEngine.setAttribute(engine, Qwt.QwtScaleEngine.Inverted)