diff options
-rw-r--r-- | gr-qtgui/grc/qtgui_range.xml | 128 | ||||
-rw-r--r-- | gr-qtgui/python/qtgui/CMakeLists.txt | 1 | ||||
-rw-r--r-- | gr-qtgui/python/qtgui/__init__.py | 3 | ||||
-rwxr-xr-x | gr-qtgui/python/qtgui/range.py | 105 |
4 files changed, 114 insertions, 123 deletions
diff --git a/gr-qtgui/grc/qtgui_range.xml b/gr-qtgui/grc/qtgui_range.xml index 2896d081ab..ecbd28a3aa 100644 --- a/gr-qtgui/grc/qtgui_range.xml +++ b/gr-qtgui/grc/qtgui_range.xml @@ -8,130 +8,12 @@ <block> <name>QT GUI Range</name> <key>variable_qtgui_range</key> - <import>from PyQt4 import Qt</import> - <import>from PyQt4.QtCore import QObject, pyqtSlot</import> - <import>import PyQt4.Qwt5 as Qwt</import> + <import>from gnuradio.qtgui import Range</import> <var_make>self.$(id) = $(id) = $value</var_make> - <make>#set $win = 'self._%s_layout'%$id -#if not $label() - #set $label = '"%s"'%$id -#end if -######################################################################## -#if $widget() == "knob" -######################################################################## -$win = Qt.QVBoxLayout() -self._$(id)_knob = Qwt.QwtKnob() -self._$(id)_knob.setRange($start, $stop, $step) -self._$(id)_knob.setValue(self.$id) -self._$(id)_knob.valueChanged.connect(self.set_$(id)) -$(win).addWidget(self._$(id)_knob) -self._$(id)_label = Qt.QLabel($label) -self._$(id)_label.setAlignment(Qt.Qt.AlignTop | Qt.Qt.AlignHCenter) -$(win).addWidget(self._$(id)_label) -#end if -######################################################################## -#if $widget() == "thermo" -######################################################################## -$win = Qt.QVBoxLayout() -self._$(id)_label = Qt.QLabel($label) -self._$(id)_thermo = Qwt.QwtThermo() -self._$(id)_thermo.setScalePosition(Qwt.QwtThermo.$orient.scalepos) -self._$(id)_thermo.setRange($start, $stop) -self._$(id)_thermo.setValue(self.$id) -self._$(id)_thermo.$(orient.minfcn)($min_len) -#if 'horizontal' in $orient().lower() -self._$(id)_label.setAlignment(Qt.Qt.AlignBottom | Qt.Qt.AlignHCenter) -$(win).addWidget(self._$(id)_label) -$(win).addWidget(self._$(id)_thermo) -#elif 'vertical' in $orient().lower() -self._$(id)_label.setAlignment(Qt.Qt.AlignTop) -$(win).addWidget(self._$(id)_thermo) -$(win).addWidget(self._$(id)_label) -#end if -#end if -######################################################################## -#if $widget() == "counter" -######################################################################## -$win = Qt.QHBoxLayout() -$(win).addWidget(Qt.QLabel($label+": ")) -class qwt_counter_pyslot(Qwt.QwtCounter): - def __init__(self, parent=None): - Qwt.QwtCounter.__init__(self, parent) - @pyqtSlot('double') - def setValue(self, value): - super(Qwt.QwtCounter, self).setValue(value) -self._$(id)_counter = qwt_counter_pyslot() -self._$(id)_counter.setRange($start, $stop, $step) -self._$(id)_counter.setNumButtons(2) -self._$(id)_counter.setMinimumWidth($min_len) -self._$(id)_counter.setValue(self.$id) -$(win).addWidget(self._$(id)_counter) -self._$(id)_counter.valueChanged.connect(self.set_$(id)) -#end if -######################################################################## -#if $widget() == "slider" -######################################################################## -$win = Qt.QVBoxLayout() -self._$(id)_label = Qt.QLabel($label) -self._$(id)_slider = Qwt.QwtSlider(None, Qt.$orient, Qwt.QwtSlider.$orient.scalepos, Qwt.QwtSlider.BgSlot) -self._$(id)_slider.setRange($start, $stop, $step) -self._$(id)_slider.setValue(self.$id) -self._$(id)_slider.$(orient.minfcn)($min_len) -self._$(id)_slider.valueChanged.connect(self.set_$(id)) -#if 'horizontal' in $orient().lower() -self._$(id)_label.setAlignment(Qt.Qt.AlignBottom | Qt.Qt.AlignHCenter) -$(win).addWidget(self._$(id)_label) -$(win).addWidget(self._$(id)_slider) -#elif 'vertical' in $orient().lower() -self._$(id)_label.setAlignment(Qt.Qt.AlignTop) -$(win).addWidget(self._$(id)_slider) -$(win).addWidget(self._$(id)_label) -#end if -#end if -######################################################################## -#if $widget() == "counter_slider" -######################################################################## -$win = Qt.QVBoxLayout() -self._$(id)_tool_bar = Qt.QToolBar(self) -$(win).addWidget(self._$(id)_tool_bar) -self._$(id)_tool_bar.addWidget(Qt.QLabel($label+": ")) -class qwt_counter_pyslot(Qwt.QwtCounter): - def __init__(self, parent=None): - Qwt.QwtCounter.__init__(self, parent) - @pyqtSlot('double') - def setValue(self, value): - super(Qwt.QwtCounter, self).setValue(value) -self._$(id)_counter = qwt_counter_pyslot() -self._$(id)_counter.setRange($start, $stop, $step) -self._$(id)_counter.setNumButtons(2) -self._$(id)_counter.setValue(self.$id) -self._$(id)_tool_bar.addWidget(self._$(id)_counter) -self._$(id)_counter.valueChanged.connect(self.set_$(id)) -self._$(id)_slider = Qwt.QwtSlider(None, Qt.Qt.Horizontal, Qwt.QwtSlider.BottomScale, Qwt.QwtSlider.BgSlot) -self._$(id)_slider.setRange($start, $stop, $step) -self._$(id)_slider.setValue(self.$id) -self._$(id)_slider.setMinimumWidth($min_len) -self._$(id)_slider.valueChanged.connect(self.set_$(id)) -$(win).addWidget(self._$(id)_slider) -#end if -$(gui_hint()($win))</make> - <callback>self.set_$(id)($value)</callback> - <callback>#if $widget() == "knob" -Qt.QMetaObject.invokeMethod(self._$(id)_knob, "setValue", Qt.Q_ARG("double", $id)) -#end if -#if $widget() == "thermo" -Qt.QMetaObject.invokeMethod(self._$(id)_thermo, "setValue", Qt.Q_ARG("double", $id)) -#end if -#if $widget() == "counter" -Qt.QMetaObject.invokeMethod(self._$(id)_counter, "setValue", Qt.Q_ARG("double", $id)) -#end if -#if $widget() == "slider" -Qt.QMetaObject.invokeMethod(self._$(id)_slider, "setValue", Qt.Q_ARG("double", $id)) -#end if -#if $widget() == "counter_slider" -Qt.QMetaObject.invokeMethod(self._$(id)_counter, "setValue", Qt.Q_ARG("double", $id)) -Qt.QMetaObject.invokeMethod(self._$(id)_slider, "setValue", Qt.Q_ARG("double", $id)) -#end if</callback> + <make>#set $win = 'self._%s'%$id +$(win) = Range($start, $stop, $step, $value, "$widget") +$(gui_hint()($win)) + </make> <param> <name>Label</name> <key>label</key> diff --git a/gr-qtgui/python/qtgui/CMakeLists.txt b/gr-qtgui/python/qtgui/CMakeLists.txt index c3d83f6034..4fa4d0f484 100644 --- a/gr-qtgui/python/qtgui/CMakeLists.txt +++ b/gr-qtgui/python/qtgui/CMakeLists.txt @@ -22,6 +22,7 @@ include(GrPython) GR_PYTHON_INSTALL( FILES __init__.py + range.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/qtgui COMPONENT "qtgui_python" ) diff --git a/gr-qtgui/python/qtgui/__init__.py b/gr-qtgui/python/qtgui/__init__.py index e9aeea7a86..d74d0f2a9e 100644 --- a/gr-qtgui/python/qtgui/__init__.py +++ b/gr-qtgui/python/qtgui/__init__.py @@ -26,9 +26,12 @@ Provides a GUI interface using the QT backend. # The presence of this file turns this directory into a Python package import os + try: from qtgui_swig import * except ImportError: dirname, filename = os.path.split(os.path.abspath(__file__)) __path__.append(os.path.join(dirname, "..", "..", "swig")) from qtgui_swig import * + +from range import Range diff --git a/gr-qtgui/python/qtgui/range.py b/gr-qtgui/python/qtgui/range.py new file mode 100755 index 0000000000..1d19818692 --- /dev/null +++ b/gr-qtgui/python/qtgui/range.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright 2015 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +from PyQt4 import Qt, QtCore, QtGui + + +class Range(QtGui.QWidget): + + def __init__(self, min, max, step, default, style): + QtGui.QWidget.__init__(self) + + self.min = min + self.max = max + self.step = step + self.default = default + + if style == "dial": + self.setupDial() + elif style == "slider": + self.setupSlider() + elif style == "counter": + self.setupCounter() + elif style == "counter_slider": + self.setupCounterSlider() + + + def setupCounterSlider(self): + """ Creates the range using a counter and slider """ + + layout = Qt.QHBoxLayout() + slider = QtGui.QSlider(QtCore.Qt.Horizontal, self) + slider.setFocusPolicy(QtCore.Qt.NoFocus) + slider.setRange(self.min, self.max) + slider.setPageStep(self.step) + slider.setSingleStep(self.step) + slider.setTracking(False) + slider.setInvertedControls(True) + layout.addWidget(slider) + + counter = QtGui.QDoubleSpinBox(self) + counter.setRange(self.min, self.max) + counter.setSingleStep(self.step) + counter.setDecimals(0) + layout.addWidget(counter) + + # Wire the events to each other + counter.valueChanged.connect(slider.setValue) + slider.valueChanged.connect(counter.setValue) + + self.setLayout(layout) + + def setupCounter(self): + """ Creates the range using a counter """ + + layout = Qt.QHBoxLayout() + counter = QtGui.QDoubleSpinBox(self) + counter.setRange(self.min, self.max) + counter.setSingleStep(self.step) + counter.setDecimals(0) + layout.addWidget(counter) + self.setLayout(layout) + + def setupSlider(self): + """ Creates the range using a slider """ + + layout = Qt.QHBoxLayout() + slider = QtGui.QSlider(QtCore.Qt.Horizontal, self) + slider.setFocusPolicy(QtCore.Qt.NoFocus) + slider.setRange(self.min, self.max) + slider.setPageStep(self.step) + slider.setSingleStep(self.step) + slider.setTracking(False) + slider.setInvertedControls(True) + layout.addWidget(slider) + self.setLayout(layout) + + def init_dial(self): + layout = Qt.QHBoxLayout() + dial = QtGui.QDial(self) + dial.setRange(min, max) + dial.setSingleStep(step) + dial.setNotchesVisible(True) + dial.setValue(init_value) + layout.addWidget(dial) + self.setLayout(layout) |