Una línea (marker) que corte el gráfico por el centro, Y= 0
Un indicador de coordenadas.
Marcar cada punto en la grafica en el que se hace clic.
Además de crear una línea horizontal donde se haga clic que “corte” la grafica.
Para crear el indicador de coordenadas se utiliza la clase QwtPlotPicker. La estructura general de este objeto es la siguiente:
- QwtPlotPicker (int xAxis,
- int yAxis,
- int selectionFlags,
- RubberBand rubberBand,
- DisplayMode trackerMode,
- QwtPlotCanvas *)
Donde:
xAxis: Es el eje de donde toma el valor mostrado con respecto al eje X. El plot puede tener dos ejes X, uno a la izquierda y otro a la derecha. En es elemento se indica de donde se tomará el valor de referencia.
yAxis: Tiene la misma función que xAxis pero tomando el eje Y como referencia.
selectionFlags: Puede seleccionarse entre PointSelection que devuelve un valor tipo QPoint o RectSelection que devuelve un valor tipo QRect.
Rubberband: Establece la forma de las líneas que indican el punto a seleccionar. Puede ser, una cruz que muestra lar coordenadas X y Y, una línea horizontal que solo muestra las coordenadas del eje X, una línea vertical que solo muestra las coordenadas del eje Y, sin líneas, una elipse, y un rectángulo. Estos dos últimos modos, solo se pueden utilizar con el tipo RectSelection.
DisplayMode: Puede ser siempre visible, visible cuando solo cuando se haga clic o invisible.
QwtPlotCanvas: Es el objeto tipo plot al que se le va a insertar el selector (picker).
En el siguiente ejemplo se creará un selector que indique las coordenadas X y Y, que sea visible solo cuando se haga clic en el plot, con el color de texto en blanco, y color de las líneas en color magenta.
- picker = Qwt.QwtPlotPicker(Qwt.QwtPlot.xBottom,
- Qwt.QwtPlot.yLeft,
- Qwt.QwtPicker.PointSelection,
- Qwt.QwtPlotPicker.CrossRubberBand,
- Qwt.QwtPicker.ActiveOnly,
- plot.canvas())
- picker.setTrackerPen(Qt.QPen(Qt.Qt.white)) #text color
- picker.setRubberBandPen(Qt.QPen(Qt.Qt.magenta))
Cuando ejecutamos el programa, al hacer clic en cualquier punto del plot obtenemos lo siguiente:
Ahora crearemos una línea horizontal que corta el gráfico por la mitad, esto se hace con un objeto qwtMarker. Solo necesitamos indicar las coordenadas de la línea, si es horizontal o vertical, y el color. Esto se hace de la siguiente manera:- #line cutting by the middle of the plot
- marker = Qwt.QwtPlotMarker()
- marker.setLineStyle(Qwt.QwtPlotMarker.HLine)
- marker.setYValue(0)
- marker.setLinePen(Qt.QPen(Qt.Qt.white))
- marker.attach(plot)
El siguiente punto es crear una marca en cada punto de la grafica en el que hagamos clic. Lo primero que debemos hacer es detectar cuando se hace clic en el plot. Para esto conectaremos la señal “selected” emitida por el objeto QwtPicker cuando se hace clic el plot, activando nuestro propio slot, en este caso se llamara plotClicked. A continuación se muestra la manera de hacerlo:
- #connect
- self.pickerX.connect(self.pickerX,
- Qt.SIGNAL('selected(const QwtDoublePoint&)'),
- self.plotClicked)
- self.plotX, self.pickerX= self.createPlot('green')
- QwtSymbol (Style, const QBrush &, const QPen &, const QSize &)
Style: Es la forma del símbolo a dibujar. Puede ser un triangulo, una cruz, una estrella, una elipse y más.
QBrush: Es el color de relleno.
QPen: Es el color de contorno.
Qsize: Es el tamaño del símbolo.
La función queda así:
- def plotClicked(self, pos):
- marker = Qwt.QwtPlotMarker()
- marker.setXValue(pos.x())
- marker.setYValue(pos.y())
- marker.setSymbol(Qwt.QwtSymbol(Qwt.QwtSymbol.Ellipse,
- Qt.QBrush(Qt.Qt.yellow),
- Qt.QPen(Qt.Qt.magenta),
- Qt.QSize(10, 10)))
- marker.attach(self.plotX)
- self.plotX.replot()
Por ultimo crearemos otro objeto QwtPlotMarker, que cortará la gráfica de X=0 a X=100. Esto podría utilizarse para indicar un límite en la amplitud de la onda, donde la onda cruce este marcador, que ejecute alguna función.
- #this creates the line mark
- triggerMark = Qwt.QwtPlotMarker()
- triggerMark.setLineStyle(Qwt.QwtPlotMarker.HLine)
- triggerMark.setLinePen(Qt.QPen(Qt.Qt.red))
- return plot, picker,triggerMark
- self.plotX, self.pickerX, self.triggerMarkX= self.createPlot('green')
- self.triggerMarkX.attach(self.plotX)
- def plotClicked(self, pos):
- marker = Qwt.QwtPlotMarker()
- marker.setXValue(pos.x())
- marker.setYValue(pos.y())
- marker.setSymbol(Qwt.QwtSymbol(Qwt.QwtSymbol.Ellipse,
- Qt.QBrush(Qt.Qt.yellow),
- Qt.QPen(Qt.Qt.magenta),
- Qt.QSize(10, 10)))
- marker.attach(self.plotX)
- self.triggerMarkX.setYValue(trunc(pos.y()))
- self.plotX.replot()
Este es el resultado:
Aquí termina el primer ejemplo. Código fuente completo:
- import sys
- from PyQt4 import QtCore, QtGui, Qt
- from Ui_ejemploqwt_ui import Ui_MainWindow
- import PyQt4.Qwt5 as Qwt
- from PyQt4.Qwt5.anynumpy import *
- class testAnalogUI(QtGui.QMainWindow):
-
- def __init__(self, parent=None):
- QtGui.QWidget.__init__(self, parent)
- self.ui = Ui_MainWindow()
- self.ui.setupUi(self)
-
- self.plotX, self.pickerX, self.triggerMarkX= self.createPlot('green')
- self.triggerMarkX.attach(self.plotX)
- #connect
- self.pickerX.connect(self.pickerX, Qt.SIGNAL('selected(const QwtDoublePoint&)'), self.plotClicked)
-
- #add the plot widget to the vertical layout created in qtdesigner
- self.ui.vlEjeX.addWidget(self.plotX)
-
- def createPlot(self, color):
- #en esta parte se crea el plot que seria todo el marco y los numeros "el cascaron"
- plot = Qwt.QwtPlot()
- plot.setCanvasBackground(QtGui.QColor("black"))
- plot.setAxisTitle(Qwt.QwtPlot.xBottom, 'X Axis')
- plot.setAxisTitle(Qwt.QwtPlot.yLeft, 'Y Axis')
- plot.setAxisScale(Qwt.QwtPlot.xBottom, 0, 100)
- plot.setAxisScale(Qwt.QwtPlot.yLeft, -100, 100,10)
- plot.setAxisAutoScale(Qwt.QwtPlot.xBottom)
-
- #creation of the curve
- curve = Qwt.QwtPlotCurve('')
- curve.setRenderHint(Qwt.QwtPlotItem.RenderAntialiased)
- pen = QtGui.QPen(QtGui.QColor(color))
- pen.setWidth(2)
- curve.setPen(pen)
- curve.attach(plot)
Descargar archivo
0 comentarios:
Publicar un comentario