2014-02-01 6 views
0

Я создаю участок Найквиста в PyQwt. В настоящее время он работает, за исключением того, что мне нужно перевернуть ось y - соглашение имеет ноль внизу и увеличивает отрицательные числа по мере продвижения.PyQwt Invert Axis (или, устанавливая атрибуты PyQwt)

Я знаю, как вы это сделаете на C++, но не можете понять, как это сделать в Python. Я не совсем понимаю, как Qt/Qwt переводится в PyQt/PyQwt. Согласно http://qwt.sourceforge.net/class_qwt_scale_engine.html, установлен атрибут 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' 

I также пытался определить новый класс, как это было сделано в http://sourceforge.net/p/pyqwt/patches/1/, как:

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 

Я получаю чувство, что я делаю это слишком сложно.

EDIT - комментарий ниже вдохновило пару вещей, как добавление =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) 

. у меня нет переводчика оперативного доступа в то время как графический интерфейс работает, но я добавил print dir(Qwt.QwtScaleEngine) к инициализации, и это, безусловно, существует:. ['Attribute', 'Floating', 'IncludeReference', 'Inverted', 'NoAttribute', 'Symmetric', '__class__',....

+0

Вы пробовали 'self.ui.qwPlot.axisScaleEngine (Qwt.QwtPlot.yLeft) .setAttribute (Qwt.QwtScaleEngine.Inverted, правда)'? Вы также можете попробовать прямо из окна консоли python, например, распечатать 'dir (Qwt.QwtScaleEngine)', чтобы узнать, определено ли это. – Schollii

+0

Я получаю синтаксическую ошибку для этого кода. (Я попытался добавить несколько парнеров, добавив 't' обратно в qwtPlot [первый]). Это вдохновило пару других вещей, которые не сработали, см. Править выше. – schodge

ответ

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)