Changes to the examples to fit updates to qtgui.
[debian/gnuradio] / gr-qtgui / src / python / pyqt_example.py
1 #!/usr/bin/env python
2
3 from gnuradio import gr
4 from gnuradio.qtgui 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.layout.addRow("Signal 1 Frequency:", self.freq1Edit)
32         self.connect(self.freq1Edit, QtCore.SIGNAL("editingFinished()"),
33                      self.freq1EditText)
34
35         self.amp1Edit = QtGui.QLineEdit(self)
36         self.layout.addRow("Signal 1 Amplitude:", self.amp1Edit)
37         self.connect(self.amp1Edit, QtCore.SIGNAL("editingFinished()"),
38                      self.amp1EditText)
39
40
41         # Control the second signal
42         self.freq2Edit = QtGui.QLineEdit(self)
43         self.layout.addRow("Signal 2 Frequency:", self.freq2Edit)
44         self.connect(self.freq2Edit, QtCore.SIGNAL("editingFinished()"),
45                      self.freq2EditText)
46
47
48         self.amp2Edit = QtGui.QLineEdit(self)
49         self.layout.addRow("Signal 2 Amplitude:", self.amp2Edit)
50         self.connect(self.amp2Edit, QtCore.SIGNAL("editingFinished()"),
51                      self.amp2EditText)
52
53         self.quit = QtGui.QPushButton('Close', self)
54         self.layout.addWidget(self.quit)
55
56         self.connect(self.quit, QtCore.SIGNAL('clicked()'),
57                      QtGui.qApp, QtCore.SLOT('quit()'))
58
59     def attach_signal1(self, signal):
60         self.signal1 = signal
61         self.freq1Edit.setText(QtCore.QString("%1").arg(self.signal1.frequency()))
62         self.amp1Edit.setText(QtCore.QString("%1").arg(self.signal1.amplitude()))
63
64     def attach_signal2(self, signal):
65         self.signal2 = signal
66         self.freq2Edit.setText(QtCore.QString("%1").arg(self.signal2.frequency()))
67         self.amp2Edit.setText(QtCore.QString("%1").arg(self.signal2.amplitude()))
68
69     def freq1EditText(self):
70         try:
71             newfreq = float(self.freq1Edit.text())
72             self.signal1.set_frequency(newfreq)
73         except ValueError:
74             print "Bad frequency value entered"
75
76     def amp1EditText(self):
77         try:
78             newamp = float(self.amp1Edit.text())
79             self.signal1.set_amplitude(newamp)
80         except ValueError:
81             print "Bad amplitude value entered"
82
83         
84     def freq2EditText(self):
85         try:
86             newfreq = float(self.freq2Edit.text())
87             self.signal2.set_frequency(newfreq)
88         except ValueError:
89             print "Bad frequency value entered"
90
91     def amp2EditText(self):
92         try:
93             newamp = float(self.amp2Edit.text())
94             self.signal2.set_amplitude(newamp)
95         except ValueError:
96             print "Bad amplitude value entered"
97
98
99 class my_top_block(gr.top_block):
100     def __init__(self):
101         gr.top_block.__init__(self)
102
103         Rs = 8000
104         f1 = 1000
105         f2 = 2000
106
107         fftsize = 2048
108
109         self.qapp = QtGui.QApplication(sys.argv)
110         
111         src1 = gr.sig_source_c(Rs, gr.GR_SIN_WAVE, f1, 0.1, 0)
112         src2 = gr.sig_source_c(Rs, gr.GR_SIN_WAVE, f2, 0.1, 0)
113         src  = gr.add_cc()
114         channel = gr.channel_model(0.001)
115         thr = gr.throttle(gr.sizeof_gr_complex, 100*fftsize)
116         self.snk1 = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS,
117                                  0, Rs,
118                                  "Complex Signal Example",
119                                  True, True, False, True, False)
120
121         self.connect(src1, (src,0))
122         self.connect(src2, (src,1))
123         self.connect(src,  channel, thr, self.snk1)
124
125         self.ctrl_win = control_box()
126         self.ctrl_win.attach_signal1(src1)
127         self.ctrl_win.attach_signal2(src2)
128
129         # Get the reference pointer to the SpectrumDisplayForm QWidget
130         pyQt  = self.snk1.pyqwidget()
131
132         # Wrap the pointer as a PyQt SIP object
133         # This can now be manipulated as a PyQt4.QtGui.QWidget
134         self.pyWin = sip.wrapinstance(pyQt, QtGui.QWidget)
135
136         self.main_box = dialog_box(self.pyWin, self.ctrl_win)
137
138         self.main_box.show()
139         
140 if __name__ == "__main__":
141     tb = my_top_block();
142     tb.start()
143     tb.qapp.exec_()
144