root / gr-qtgui / apps / pyqt_time_c.py @ 5af704f3
History | View | Annotate | Download (5.4 kB)
| 1 | #!/usr/bin/env python
|
|---|---|
| 2 | |
| 3 | from gnuradio import gr |
| 4 | from gnuradio import qtgui |
| 5 | from PyQt4 import QtGui, QtCore |
| 6 | import sys, sip |
| 7 | |
| 8 | class dialog_box(QtGui.QWidget): |
| 9 | def __init__(self, display, control): |
| 10 | QtGui.QWidget.__init__(self, None) |
| 11 | self.setWindowTitle('PyQt Test GUI') |
| 12 | |
| 13 | self.boxlayout = QtGui.QBoxLayout(QtGui.QBoxLayout.LeftToRight, self) |
| 14 | self.boxlayout.addWidget(display, 1) |
| 15 | self.boxlayout.addWidget(control)
|
| 16 | |
| 17 | self.resize(800, 500) |
| 18 | |
| 19 | class control_box(QtGui.QWidget): |
| 20 | def __init__(self, parent=None): |
| 21 | QtGui.QWidget.__init__(self, parent)
|
| 22 | self.setWindowTitle('Control Panel') |
| 23 | |
| 24 | self.setToolTip('Control the signals') |
| 25 | QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10)) |
| 26 | |
| 27 | self.layout = QtGui.QFormLayout(self) |
| 28 | |
| 29 | # Control the first signal
|
| 30 | self.freq1Edit = QtGui.QLineEdit(self) |
| 31 | self.freq1Edit.setMinimumWidth(100) |
| 32 | self.layout.addRow("Signal 1 Frequency:", self.freq1Edit) |
| 33 | self.connect(self.freq1Edit, QtCore.SIGNAL("editingFinished()"), |
| 34 | self.freq1EditText)
|
| 35 | |
| 36 | self.amp1Edit = QtGui.QLineEdit(self) |
| 37 | self.amp1Edit.setMinimumWidth(100) |
| 38 | self.layout.addRow("Signal 1 Amplitude:", self.amp1Edit) |
| 39 | self.connect(self.amp1Edit, QtCore.SIGNAL("editingFinished()"), |
| 40 | self.amp1EditText)
|
| 41 | |
| 42 | |
| 43 | # Control the second signal
|
| 44 | self.freq2Edit = QtGui.QLineEdit(self) |
| 45 | self.freq2Edit.setMinimumWidth(100) |
| 46 | self.layout.addRow("Signal 2 Frequency:", self.freq2Edit) |
| 47 | self.connect(self.freq2Edit, QtCore.SIGNAL("editingFinished()"), |
| 48 | self.freq2EditText)
|
| 49 | |
| 50 | |
| 51 | self.amp2Edit = QtGui.QLineEdit(self) |
| 52 | self.amp2Edit.setMinimumWidth(100) |
| 53 | self.layout.addRow("Signal 2 Amplitude:", self.amp2Edit) |
| 54 | self.connect(self.amp2Edit, QtCore.SIGNAL("editingFinished()"), |
| 55 | self.amp2EditText)
|
| 56 | |
| 57 | self.quit = QtGui.QPushButton('Close', self) |
| 58 | self.quit.setMinimumWidth(100) |
| 59 | self.layout.addWidget(self.quit) |
| 60 | |
| 61 | self.connect(self.quit, QtCore.SIGNAL('clicked()'), |
| 62 | QtGui.qApp, QtCore.SLOT('quit()'))
|
| 63 | |
| 64 | def attach_signal1(self, signal): |
| 65 | self.signal1 = signal
|
| 66 | self.freq1Edit.setText(QtCore.QString("%1").arg(self.signal1.frequency())) |
| 67 | self.amp1Edit.setText(QtCore.QString("%1").arg(self.signal1.amplitude())) |
| 68 | |
| 69 | def attach_signal2(self, signal): |
| 70 | self.signal2 = signal
|
| 71 | self.freq2Edit.setText(QtCore.QString("%1").arg(self.signal2.frequency())) |
| 72 | self.amp2Edit.setText(QtCore.QString("%1").arg(self.signal2.amplitude())) |
| 73 | |
| 74 | def freq1EditText(self): |
| 75 | try:
|
| 76 | newfreq = float(self.freq1Edit.text()) |
| 77 | self.signal1.set_frequency(newfreq)
|
| 78 | except ValueError: |
| 79 | print "Bad frequency value entered" |
| 80 | |
| 81 | def amp1EditText(self): |
| 82 | try:
|
| 83 | newamp = float(self.amp1Edit.text()) |
| 84 | self.signal1.set_amplitude(newamp)
|
| 85 | except ValueError: |
| 86 | print "Bad amplitude value entered" |
| 87 | |
| 88 | |
| 89 | def freq2EditText(self): |
| 90 | try:
|
| 91 | newfreq = float(self.freq2Edit.text()) |
| 92 | self.signal2.set_frequency(newfreq)
|
| 93 | except ValueError: |
| 94 | print "Bad frequency value entered" |
| 95 | |
| 96 | def amp2EditText(self): |
| 97 | try:
|
| 98 | newamp = float(self.amp2Edit.text()) |
| 99 | self.signal2.set_amplitude(newamp)
|
| 100 | except ValueError: |
| 101 | print "Bad amplitude value entered" |
| 102 | |
| 103 | |
| 104 | class my_top_block(gr.top_block): |
| 105 | def __init__(self): |
| 106 | gr.top_block.__init__(self)
|
| 107 | |
| 108 | Rs = 8000
|
| 109 | f1 = 100
|
| 110 | f2 = 200
|
| 111 | |
| 112 | npts = 2048
|
| 113 | |
| 114 | self.qapp = QtGui.QApplication(sys.argv)
|
| 115 | |
| 116 | src1 = gr.sig_source_c(Rs, gr.GR_SIN_WAVE, f1, 0.1, 0) |
| 117 | src2 = gr.sig_source_c(Rs, gr.GR_SIN_WAVE, f2, 0.1, 0) |
| 118 | src = gr.add_cc() |
| 119 | channel = gr.channel_model(0.01)
|
| 120 | thr = gr.throttle(gr.sizeof_gr_complex, 100*npts)
|
| 121 | self.snk1 = qtgui.time_sink_c(npts, Rs,
|
| 122 | "Complex Time Example", 3) |
| 123 | |
| 124 | self.connect(src1, (src,0)) |
| 125 | self.connect(src2, (src,1)) |
| 126 | self.connect(src, channel, thr, (self.snk1, 0)) |
| 127 | self.connect(src1, (self.snk1, 1)) |
| 128 | self.connect(src2, (self.snk1, 2)) |
| 129 | |
| 130 | self.ctrl_win = control_box()
|
| 131 | self.ctrl_win.attach_signal1(src1)
|
| 132 | self.ctrl_win.attach_signal2(src2)
|
| 133 | |
| 134 | # Get the reference pointer to the SpectrumDisplayForm QWidget
|
| 135 | pyQt = self.snk1.pyqwidget()
|
| 136 | |
| 137 | # Wrap the pointer as a PyQt SIP object
|
| 138 | # This can now be manipulated as a PyQt4.QtGui.QWidget
|
| 139 | pyWin = sip.wrapinstance(pyQt, QtGui.QWidget) |
| 140 | |
| 141 | # Example of using signal/slot to set the title of a curve
|
| 142 | pyWin.connect(pyWin, QtCore.SIGNAL("setTitle(int, QString)"),
|
| 143 | pyWin, QtCore.SLOT("setTitle(int, QString)"))
|
| 144 | pyWin.emit(QtCore.SIGNAL("setTitle(int, QString)"), 0, "Re{sum}") |
| 145 | self.snk1.set_title(1, "Im{Sum}") |
| 146 | self.snk1.set_title(2, "Re{src1}") |
| 147 | self.snk1.set_title(3, "Im{src1}") |
| 148 | self.snk1.set_title(4, "Re{src2}") |
| 149 | self.snk1.set_title(5, "Im{src2}") |
| 150 | |
| 151 | # Can also set the color of a curve
|
| 152 | #self.snk1.set_color(5, "blue")
|
| 153 | |
| 154 | #pyWin.show()
|
| 155 | self.main_box = dialog_box(pyWin, self.ctrl_win) |
| 156 | self.main_box.show()
|
| 157 | |
| 158 | if __name__ == "__main__": |
| 159 | tb = my_top_block(); |
| 160 | tb.start() |
| 161 | tb.qapp.exec_() |
| 162 | tb.stop() |
| 163 |