PyQwt反转轴(或设置PyQwt属性)

时间:2014-02-01 01:04:48

标签: python qt plot pyqt qwt

我正在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__',....

1 个答案:

答案 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)