Receita: CalculadoraQt
Esta é uma calculadora simples, projetada para ter um comportamento similar às calculadoras de mão.
Foi feita com PyQt e QtDesigner. O código demonstra o uso de um "cache de funções", uma estratégia usada para que possamos utilizar os métodos gerados dinamicamente. Em PyQt especificamente, isto é necessário pois precisamos manter uma referência para todos os métodos dinâmicos (como os gerados com lambda) que forem usados como slots, ou a coleta de lixo irá garantir que não funcionem (o que é normal e esperado, já que as referências para slots são fracas).
O primeiro código é aquele gerado pelo QtDesigner (para quem quiser mexer). O segundo é o código Python gerado via pyuic. O terceiro é uma classe que extende o primeiro, adicionando a ação. O quarto, nosso main().
Obs.: Antes que digam que o código ficou grande, notem que só precisamos mexer com os dois últimos, sendo o último simples e cotidiano. Conhecendo a ferramenta dá pra perceber que o código fica bem econômico e simples de manter.
Código
calcform.ui
1 <!DOCTYPE UI><UI version="3.3" stdsetdef="1">
2 <class>CalcForm</class>
3 <widget class="QWidget">
4 <property name="name">
5 <cstring>CalcForm</cstring>
6 </property>
7 <property name="geometry">
8 <rect>
9 <x>0</x>
10 <y>0</y>
11 <width>252</width>
12 <height>309</height>
13 </rect>
14 </property>
15 <property name="caption">
16 <string>Calculadora</string>
17 </property>
18 <grid>
19 <property name="name">
20 <cstring>unnamed</cstring>
21 </property>
22 <property name="resizeMode">
23 <enum>Fixed</enum>
24 </property>
25 <widget class="QLineEdit" row="0" column="0" rowspan="1" colspan="4">
26 <property name="name">
27 <cstring>resultEdit</cstring>
28 </property>
29 <property name="minimumSize">
30 <size>
31 <width>0</width>
32 <height>45</height>
33 </size>
34 </property>
35 <property name="font">
36 <font>
37 <pointsize>14</pointsize>
38 <bold>1</bold>
39 </font>
40 </property>
41 <property name="alignment">
42 <set>AlignRight</set>
43 </property>
44 <property name="readOnly">
45 <bool>true</bool>
46 </property>
47 <property name="toolTip" stdset="0">
48 <string>Resultados</string>
49 </property>
50 </widget>
51 <widget class="QPushButton" row="1" column="2">
52 <property name="name">
53 <cstring>backspaceButton</cstring>
54 </property>
55 <property name="minimumSize">
56 <size>
57 <width>50</width>
58 <height>40</height>
59 </size>
60 </property>
61 <property name="paletteForegroundColor">
62 <color>
63 <red>0</red>
64 <green>170</green>
65 <blue>0</blue>
66 </color>
67 </property>
68 <property name="font">
69 <font>
70 <bold>1</bold>
71 </font>
72 </property>
73 <property name="text">
74 <string>B</string>
75 </property>
76 </widget>
77 <widget class="QPushButton" row="5" column="1">
78 <property name="name">
79 <cstring>n0Button</cstring>
80 </property>
81 <property name="minimumSize">
82 <size>
83 <width>50</width>
84 <height>40</height>
85 </size>
86 </property>
87 <property name="font">
88 <font>
89 <bold>1</bold>
90 </font>
91 </property>
92 <property name="text">
93 <string>0</string>
94 </property>
95 </widget>
96 <widget class="QPushButton" row="4" column="2">
97 <property name="name">
98 <cstring>n3Button</cstring>
99 </property>
100 <property name="minimumSize">
101 <size>
102 <width>50</width>
103 <height>40</height>
104 </size>
105 </property>
106 <property name="font">
107 <font>
108 <bold>1</bold>
109 </font>
110 </property>
111 <property name="text">
112 <string>3</string>
113 </property>
114 </widget>
115 <widget class="QPushButton" row="4" column="0">
116 <property name="name">
117 <cstring>n1Button</cstring>
118 </property>
119 <property name="minimumSize">
120 <size>
121 <width>50</width>
122 <height>40</height>
123 </size>
124 </property>
125 <property name="font">
126 <font>
127 <bold>1</bold>
128 </font>
129 </property>
130 <property name="text">
131 <string>1</string>
132 </property>
133 </widget>
134 <widget class="QPushButton" row="2" column="0">
135 <property name="name">
136 <cstring>n7Button</cstring>
137 </property>
138 <property name="minimumSize">
139 <size>
140 <width>50</width>
141 <height>40</height>
142 </size>
143 </property>
144 <property name="font">
145 <font>
146 <bold>1</bold>
147 </font>
148 </property>
149 <property name="text">
150 <string>7</string>
151 </property>
152 </widget>
153 <widget class="QPushButton" row="1" column="3">
154 <property name="name">
155 <cstring>clearButton</cstring>
156 </property>
157 <property name="minimumSize">
158 <size>
159 <width>50</width>
160 <height>40</height>
161 </size>
162 </property>
163 <property name="paletteForegroundColor">
164 <color>
165 <red>255</red>
166 <green>0</green>
167 <blue>0</blue>
168 </color>
169 </property>
170 <property name="font">
171 <font>
172 <bold>1</bold>
173 </font>
174 </property>
175 <property name="text">
176 <string>C</string>
177 </property>
178 </widget>
179 <widget class="QPushButton" row="5" column="2">
180 <property name="name">
181 <cstring>calcButton</cstring>
182 </property>
183 <property name="minimumSize">
184 <size>
185 <width>50</width>
186 <height>40</height>
187 </size>
188 </property>
189 <property name="paletteForegroundColor">
190 <color>
191 <red>0</red>
192 <green>0</green>
193 <blue>255</blue>
194 </color>
195 </property>
196 <property name="font">
197 <font>
198 <bold>1</bold>
199 </font>
200 </property>
201 <property name="text">
202 <string>=</string>
203 </property>
204 </widget>
205 <widget class="QPushButton" row="3" column="3">
206 <property name="name">
207 <cstring>subButton</cstring>
208 </property>
209 <property name="minimumSize">
210 <size>
211 <width>50</width>
212 <height>40</height>
213 </size>
214 </property>
215 <property name="font">
216 <font>
217 <bold>1</bold>
218 </font>
219 </property>
220 <property name="text">
221 <string>-</string>
222 </property>
223 </widget>
224 <widget class="QPushButton" row="3" column="2">
225 <property name="name">
226 <cstring>n6Button</cstring>
227 </property>
228 <property name="minimumSize">
229 <size>
230 <width>50</width>
231 <height>40</height>
232 </size>
233 </property>
234 <property name="font">
235 <font>
236 <bold>1</bold>
237 </font>
238 </property>
239 <property name="text">
240 <string>6</string>
241 </property>
242 </widget>
243 <widget class="QPushButton" row="5" column="3">
244 <property name="name">
245 <cstring>divButton</cstring>
246 </property>
247 <property name="minimumSize">
248 <size>
249 <width>50</width>
250 <height>40</height>
251 </size>
252 </property>
253 <property name="font">
254 <font>
255 <bold>1</bold>
256 </font>
257 </property>
258 <property name="text">
259 <string>/</string>
260 </property>
261 </widget>
262 <widget class="QPushButton" row="3" column="0">
263 <property name="name">
264 <cstring>n4Button</cstring>
265 </property>
266 <property name="minimumSize">
267 <size>
268 <width>50</width>
269 <height>40</height>
270 </size>
271 </property>
272 <property name="font">
273 <font>
274 <bold>1</bold>
275 </font>
276 </property>
277 <property name="text">
278 <string>4</string>
279 </property>
280 </widget>
281 <widget class="QPushButton" row="2" column="3">
282 <property name="name">
283 <cstring>sumButton</cstring>
284 </property>
285 <property name="minimumSize">
286 <size>
287 <width>50</width>
288 <height>40</height>
289 </size>
290 </property>
291 <property name="font">
292 <font>
293 <bold>1</bold>
294 </font>
295 </property>
296 <property name="text">
297 <string>+</string>
298 </property>
299 </widget>
300 <widget class="QPushButton" row="4" column="1">
301 <property name="name">
302 <cstring>n2Button</cstring>
303 </property>
304 <property name="minimumSize">
305 <size>
306 <width>50</width>
307 <height>40</height>
308 </size>
309 </property>
310 <property name="font">
311 <font>
312 <bold>1</bold>
313 </font>
314 </property>
315 <property name="text">
316 <string>2</string>
317 </property>
318 </widget>
319 <widget class="QPushButton" row="3" column="1">
320 <property name="name">
321 <cstring>n5Button</cstring>
322 </property>
323 <property name="minimumSize">
324 <size>
325 <width>50</width>
326 <height>40</height>
327 </size>
328 </property>
329 <property name="font">
330 <font>
331 <bold>1</bold>
332 </font>
333 </property>
334 <property name="text">
335 <string>5</string>
336 </property>
337 </widget>
338 <widget class="QPushButton" row="4" column="3">
339 <property name="name">
340 <cstring>mulButton</cstring>
341 </property>
342 <property name="minimumSize">
343 <size>
344 <width>50</width>
345 <height>40</height>
346 </size>
347 </property>
348 <property name="font">
349 <font>
350 <bold>1</bold>
351 </font>
352 </property>
353 <property name="text">
354 <string>X</string>
355 </property>
356 </widget>
357 <widget class="QPushButton" row="2" column="1">
358 <property name="name">
359 <cstring>n8Button</cstring>
360 </property>
361 <property name="minimumSize">
362 <size>
363 <width>50</width>
364 <height>40</height>
365 </size>
366 </property>
367 <property name="font">
368 <font>
369 <bold>1</bold>
370 </font>
371 </property>
372 <property name="text">
373 <string>8</string>
374 </property>
375 </widget>
376 <widget class="QPushButton" row="2" column="2">
377 <property name="name">
378 <cstring>n9Button</cstring>
379 </property>
380 <property name="minimumSize">
381 <size>
382 <width>50</width>
383 <height>40</height>
384 </size>
385 </property>
386 <property name="font">
387 <font>
388 <bold>1</bold>
389 </font>
390 </property>
391 <property name="text">
392 <string>9</string>
393 </property>
394 </widget>
395 <widget class="QPushButton" row="5" column="0">
396 <property name="name">
397 <cstring>floatPointButton</cstring>
398 </property>
399 <property name="minimumSize">
400 <size>
401 <width>50</width>
402 <height>40</height>
403 </size>
404 </property>
405 <property name="font">
406 <font>
407 <bold>1</bold>
408 </font>
409 </property>
410 <property name="text">
411 <string>.</string>
412 </property>
413 </widget>
414 </grid>
415 </widget>
416 <tabstops>
417 <tabstop>resultEdit</tabstop>
418 <tabstop>backspaceButton</tabstop>
419 <tabstop>clearButton</tabstop>
420 <tabstop>n7Button</tabstop>
421 <tabstop>n8Button</tabstop>
422 <tabstop>n9Button</tabstop>
423 <tabstop>sumButton</tabstop>
424 <tabstop>n4Button</tabstop>
425 <tabstop>n5Button</tabstop>
426 <tabstop>n6Button</tabstop>
427 <tabstop>subButton</tabstop>
428 <tabstop>n1Button</tabstop>
429 <tabstop>n2Button</tabstop>
430 <tabstop>n3Button</tabstop>
431 <tabstop>mulButton</tabstop>
432 <tabstop>floatPointButton</tabstop>
433 <tabstop>n0Button</tabstop>
434 <tabstop>calcButton</tabstop>
435 <tabstop>divButton</tabstop>
436 </tabstops>
437 <layoutdefaults spacing="6" margin="11"/>
438 </UI>
calcform.py
1 # -*- coding: utf-8 -*-
2
3 # Form implementation generated from reading ui file 'calcform.ui'
4 #
5 # Created: Seg Set 5 21:17:18 2005
6 # by: The PyQt User Interface Compiler (pyuic) 3.13
7 #
8 # WARNING! All changes made in this file will be lost!
9
10
11 from qt import *
12
13
14 class CalcForm(QWidget):
15 def __init__(self,parent = None,name = None,fl = 0):
16 QWidget.__init__(self,parent,name,fl)
17
18 if not name:
19 self.setName("CalcForm")
20
21
22 CalcFormLayout = QGridLayout(self,1,1,11,6,"CalcFormLayout")
23 CalcFormLayout.setResizeMode(QLayout.Fixed)
24
25 self.resultEdit = QLineEdit(self,"resultEdit")
26 self.resultEdit.setMinimumSize(QSize(0,45))
27 resultEdit_font = QFont(self.resultEdit.font())
28 resultEdit_font.setPointSize(14)
29 resultEdit_font.setBold(1)
30 self.resultEdit.setFont(resultEdit_font)
31 self.resultEdit.setAlignment(QLineEdit.AlignRight)
32 self.resultEdit.setReadOnly(1)
33
34 CalcFormLayout.addMultiCellWidget(self.resultEdit,0,0,0,3)
35
36 self.backspaceButton = QPushButton(self,"backspaceButton")
37 self.backspaceButton.setMinimumSize(QSize(50,40))
38 self.backspaceButton.setPaletteForegroundColor(QColor(0,170,0))
39 backspaceButton_font = QFont(self.backspaceButton.font())
40 backspaceButton_font.setBold(1)
41 self.backspaceButton.setFont(backspaceButton_font)
42
43 CalcFormLayout.addWidget(self.backspaceButton,1,2)
44
45 self.n0Button = QPushButton(self,"n0Button")
46 self.n0Button.setMinimumSize(QSize(50,40))
47 n0Button_font = QFont(self.n0Button.font())
48 n0Button_font.setBold(1)
49 self.n0Button.setFont(n0Button_font)
50
51 CalcFormLayout.addWidget(self.n0Button,5,1)
52
53 self.n3Button = QPushButton(self,"n3Button")
54 self.n3Button.setMinimumSize(QSize(50,40))
55 n3Button_font = QFont(self.n3Button.font())
56 n3Button_font.setBold(1)
57 self.n3Button.setFont(n3Button_font)
58
59 CalcFormLayout.addWidget(self.n3Button,4,2)
60
61 self.n1Button = QPushButton(self,"n1Button")
62 self.n1Button.setMinimumSize(QSize(50,40))
63 n1Button_font = QFont(self.n1Button.font())
64 n1Button_font.setBold(1)
65 self.n1Button.setFont(n1Button_font)
66
67 CalcFormLayout.addWidget(self.n1Button,4,0)
68
69 self.n7Button = QPushButton(self,"n7Button")
70 self.n7Button.setMinimumSize(QSize(50,40))
71 n7Button_font = QFont(self.n7Button.font())
72 n7Button_font.setBold(1)
73 self.n7Button.setFont(n7Button_font)
74
75 CalcFormLayout.addWidget(self.n7Button,2,0)
76
77 self.clearButton = QPushButton(self,"clearButton")
78 self.clearButton.setMinimumSize(QSize(50,40))
79 self.clearButton.setPaletteForegroundColor(QColor(255,0,0))
80 clearButton_font = QFont(self.clearButton.font())
81 clearButton_font.setBold(1)
82 self.clearButton.setFont(clearButton_font)
83
84 CalcFormLayout.addWidget(self.clearButton,1,3)
85
86 self.calcButton = QPushButton(self,"calcButton")
87 self.calcButton.setMinimumSize(QSize(50,40))
88 self.calcButton.setPaletteForegroundColor(QColor(0,0,255))
89 calcButton_font = QFont(self.calcButton.font())
90 calcButton_font.setBold(1)
91 self.calcButton.setFont(calcButton_font)
92
93 CalcFormLayout.addWidget(self.calcButton,5,2)
94
95 self.subButton = QPushButton(self,"subButton")
96 self.subButton.setMinimumSize(QSize(50,40))
97 subButton_font = QFont(self.subButton.font())
98 subButton_font.setBold(1)
99 self.subButton.setFont(subButton_font)
100
101 CalcFormLayout.addWidget(self.subButton,3,3)
102
103 self.n6Button = QPushButton(self,"n6Button")
104 self.n6Button.setMinimumSize(QSize(50,40))
105 n6Button_font = QFont(self.n6Button.font())
106 n6Button_font.setBold(1)
107 self.n6Button.setFont(n6Button_font)
108
109 CalcFormLayout.addWidget(self.n6Button,3,2)
110
111 self.divButton = QPushButton(self,"divButton")
112 self.divButton.setMinimumSize(QSize(50,40))
113 divButton_font = QFont(self.divButton.font())
114 divButton_font.setBold(1)
115 self.divButton.setFont(divButton_font)
116
117 CalcFormLayout.addWidget(self.divButton,5,3)
118
119 self.n4Button = QPushButton(self,"n4Button")
120 self.n4Button.setMinimumSize(QSize(50,40))
121 n4Button_font = QFont(self.n4Button.font())
122 n4Button_font.setBold(1)
123 self.n4Button.setFont(n4Button_font)
124
125 CalcFormLayout.addWidget(self.n4Button,3,0)
126
127 self.sumButton = QPushButton(self,"sumButton")
128 self.sumButton.setMinimumSize(QSize(50,40))
129 sumButton_font = QFont(self.sumButton.font())
130 sumButton_font.setBold(1)
131 self.sumButton.setFont(sumButton_font)
132
133 CalcFormLayout.addWidget(self.sumButton,2,3)
134
135 self.n2Button = QPushButton(self,"n2Button")
136 self.n2Button.setMinimumSize(QSize(50,40))
137 n2Button_font = QFont(self.n2Button.font())
138 n2Button_font.setBold(1)
139 self.n2Button.setFont(n2Button_font)
140
141 CalcFormLayout.addWidget(self.n2Button,4,1)
142
143 self.n5Button = QPushButton(self,"n5Button")
144 self.n5Button.setMinimumSize(QSize(50,40))
145 n5Button_font = QFont(self.n5Button.font())
146 n5Button_font.setBold(1)
147 self.n5Button.setFont(n5Button_font)
148
149 CalcFormLayout.addWidget(self.n5Button,3,1)
150
151 self.mulButton = QPushButton(self,"mulButton")
152 self.mulButton.setMinimumSize(QSize(50,40))
153 mulButton_font = QFont(self.mulButton.font())
154 mulButton_font.setBold(1)
155 self.mulButton.setFont(mulButton_font)
156
157 CalcFormLayout.addWidget(self.mulButton,4,3)
158
159 self.n8Button = QPushButton(self,"n8Button")
160 self.n8Button.setMinimumSize(QSize(50,40))
161 n8Button_font = QFont(self.n8Button.font())
162 n8Button_font.setBold(1)
163 self.n8Button.setFont(n8Button_font)
164
165 CalcFormLayout.addWidget(self.n8Button,2,1)
166
167 self.n9Button = QPushButton(self,"n9Button")
168 self.n9Button.setMinimumSize(QSize(50,40))
169 n9Button_font = QFont(self.n9Button.font())
170 n9Button_font.setBold(1)
171 self.n9Button.setFont(n9Button_font)
172
173 CalcFormLayout.addWidget(self.n9Button,2,2)
174
175 self.floatPointButton = QPushButton(self,"floatPointButton")
176 self.floatPointButton.setMinimumSize(QSize(50,40))
177 floatPointButton_font = QFont(self.floatPointButton.font())
178 floatPointButton_font.setBold(1)
179 self.floatPointButton.setFont(floatPointButton_font)
180
181 CalcFormLayout.addWidget(self.floatPointButton,5,0)
182
183 self.languageChange()
184
185 self.resize(QSize(252,309).expandedTo(self.minimumSizeHint()))
186 self.clearWState(Qt.WState_Polished)
187
188 self.setTabOrder(self.resultEdit,self.backspaceButton)
189 self.setTabOrder(self.backspaceButton,self.clearButton)
190 self.setTabOrder(self.clearButton,self.n7Button)
191 self.setTabOrder(self.n7Button,self.n8Button)
192 self.setTabOrder(self.n8Button,self.n9Button)
193 self.setTabOrder(self.n9Button,self.sumButton)
194 self.setTabOrder(self.sumButton,self.n4Button)
195 self.setTabOrder(self.n4Button,self.n5Button)
196 self.setTabOrder(self.n5Button,self.n6Button)
197 self.setTabOrder(self.n6Button,self.subButton)
198 self.setTabOrder(self.subButton,self.n1Button)
199 self.setTabOrder(self.n1Button,self.n2Button)
200 self.setTabOrder(self.n2Button,self.n3Button)
201 self.setTabOrder(self.n3Button,self.mulButton)
202 self.setTabOrder(self.mulButton,self.floatPointButton)
203 self.setTabOrder(self.floatPointButton,self.n0Button)
204 self.setTabOrder(self.n0Button,self.calcButton)
205 self.setTabOrder(self.calcButton,self.divButton)
206
207
208 def languageChange(self):
209 self.setCaption(self.__tr("Calculadora"))
210 QToolTip.add(self.resultEdit,self.__tr("Resultados"))
211 self.backspaceButton.setText(self.__tr("B"))
212 self.n0Button.setText(self.__tr("0"))
213 self.n3Button.setText(self.__tr("3"))
214 self.n1Button.setText(self.__tr("1"))
215 self.n7Button.setText(self.__tr("7"))
216 self.clearButton.setText(self.__tr("C"))
217 self.calcButton.setText(self.__tr("="))
218 self.subButton.setText(self.__tr("-"))
219 self.n6Button.setText(self.__tr("6"))
220 self.divButton.setText(self.__tr("/"))
221 self.n4Button.setText(self.__tr("4"))
222 self.sumButton.setText(self.__tr("+"))
223 self.n2Button.setText(self.__tr("2"))
224 self.n5Button.setText(self.__tr("5"))
225 self.mulButton.setText(self.__tr("X"))
226 self.n8Button.setText(self.__tr("8"))
227 self.n9Button.setText(self.__tr("9"))
228 self.floatPointButton.setText(self.__tr("."))
229
230
231 def __tr(self,s,c = None):
232 return qApp.translate("CalcForm",s,c)
calcwidget.py
1 # -*- coding: iso-8859-1 -*-
2
3 from calcform import CalcForm
4 import qt
5
6 class CalcWidget(CalcForm):
7 """Define a janela de calculadora.
8 """
9 def __init__(self):
10 """Prepara widget.
11 """
12 super(CalcWidget, self).__init__()
13 self.setFocusPolicy(self.StrongFocus)
14 self.resultEdit.setFocusPolicy(self.NoFocus)
15 # Cache de ações.
16 self.action = {}
17 self.action[0] = self.__funcAppendToResult('0')
18 self.action[1] = self.__funcAppendToResult('1')
19 self.action[2] = self.__funcAppendToResult('2')
20 self.action[3] = self.__funcAppendToResult('3')
21 self.action[4] = self.__funcAppendToResult('4')
22 self.action[5] = self.__funcAppendToResult('5')
23 self.action[6] = self.__funcAppendToResult('6')
24 self.action[7] = self.__funcAppendToResult('7')
25 self.action[8] = self.__funcAppendToResult('8')
26 self.action[9] = self.__funcAppendToResult('9')
27 self.action['+'] = self.__funcDoOperation('+')
28 self.action['-'] = self.__funcDoOperation('-')
29 self.action['*'] = self.__funcDoOperation('*')
30 self.action['/'] = self.__funcDoOperation('/')
31 # Conecta ações dos botões numéricos.
32 self.connect(self.n0Button, qt.SIGNAL('clicked()'), \
33 self.action[0])
34 self.connect(self.n1Button, qt.SIGNAL('clicked()'), \
35 self.action[1])
36 self.connect(self.n2Button, qt.SIGNAL('clicked()'), \
37 self.action[2])
38 self.connect(self.n3Button, qt.SIGNAL('clicked()'), \
39 self.action[3])
40 self.connect(self.n4Button, qt.SIGNAL('clicked()'), \
41 self.action[4])
42 self.connect(self.n5Button, qt.SIGNAL('clicked()'), \
43 self.action[5])
44 self.connect(self.n6Button, qt.SIGNAL('clicked()'), \
45 self.action[6])
46 self.connect(self.n7Button, qt.SIGNAL('clicked()'), \
47 self.action[7])
48 self.connect(self.n8Button, qt.SIGNAL('clicked()'), \
49 self.action[8])
50 self.connect(self.n9Button, qt.SIGNAL('clicked()'), \
51 self.action[9])
52 # Botão ponto flutuante.
53 self.connect(self.floatPointButton, qt.SIGNAL('clicked()'), \
54 self.appendFloatPoint)
55 # Botão clear.
56 self.connect(self.clearButton, qt.SIGNAL('clicked()'), \
57 self.doClear)
58 # Botão back.
59 self.connect(self.backspaceButton, qt.SIGNAL('clicked()'), \
60 self.doBackspace)
61
62 # Inicializa dados para o cálculo.
63 self.doClear()
64
65 def text(self):
66 """Retorna texto atual no campo de resultado.
67 """
68 return str(self.resultEdit.text())
69
70 def setText(self, text):
71 """Atribui um novo texto ao campo de resultado.
72 """
73 self.resultEdit.setText(text)
74
75 def appendText(self, text):
76 """Adiciona um texto ao final do campo de resultado.
77 """
78 self.resultEdit.setText(str(self.resultEdit.text()) + text)
79
80 def doClear(self):
81 """Reinicia cálculos.
82 """
83 # Resultados iniciais.
84 self.res = 0
85 # Nenhum operador até então.
86 self.op = None
87 # Ainda sem ponto flutuante.
88 self.floatPoint = False
89 # Texto inicial.
90 self.resultEdit.setText('0')
91 # Controla se alguma tecla foi ou não pressionada.
92 self.calcKey = False
93
94 def doBackspace(self):
95 """Remove o último caractere do campo de texto.
96 """
97 # Marca ponto flutuante como não usado se excluído.
98 if self.text()[-1] == '.':
99 self.floatPoint = False
100 self.setText(self.text()[:-1])
101 # Coloca '0' se o campo estiver vazio.
102 if len(self.text()) == 0:
103 self.setText('0')
104
105 def doCalc(self):
106 """Realiza qualquer cálculo aguardando execução e exibe o resultado.
107 """
108 # Se a tecla já foi pressionada, ignora.
109 if self.calcKey:
110 return
111 # Captura valor atual.
112 current = self.text()
113 # Calcula (se houver operação).
114 if self.op == None:
115 self.res = float(current)
116 else:
117 try:
118 self.res = eval(str(self.res) + self.op + current)
119 # Exibe resultado.
120 self.setText(str(self.res))
121 except ZeroDivisionError:
122 self.doClear()
123 qt.QMessageBox.warning(self, 'Erro', \
124 'Divisão por zero', qt.QMessageBox.Ok)
125 return
126 # Marca cálculo como realizado.
127 self.op = None
128 # Marca tecla pressionada.
129 self.calcKey = True
130
131 def __funcAppendToResult(self, s):
132 """Gera um método que adiciona a string especificada ao campo
133 de resultado.
134 """
135 def appendToResult():
136 # Remove o '0' inicial.
137 # Verifica se está iniciando uma nova operação.
138 if self.text() != '0' and not self.calcKey:
139 self.appendText(s)
140 else:
141 self.setText(s)
142 # Marca tecla como pressionada.
143 self.calcKey = False
144 return appendToResult
145
146 def __funcDoOperation(self, op):
147 """Gera um método que realiza a operação especificada.
148 """
149 def doOperation():
150 self.doCalc()
151 self.op = op
152 return doOperation
153
154 def appendFloatPoint(self):
155 """Adiciona um caractere de ponto flutuante ao campo de resultado.
156
157 Caso já exista um ponto, ignora.
158 """
159 # Verifica se está iniciando uma nova operação.
160 if self.op:
161 self.setText('0.')
162 # Reinicia operador.
163 self.op = None
164 if not self.floatPoint:
165 self.appendText('.')
166 self.floatPoint = True
167
168 def keyPressEvent(self, evt):
169 """Evento disparado ao receber eventos do teclado.
170 """
171 # Números.
172 if evt.text() == '0':
173 self.action[0]()
174 elif evt.text() == '1':
175 self.action[1]()
176 elif evt.text() == '2':
177 self.action[2]()
178 elif evt.text() == '3':
179 self.action[3]()
180 elif evt.text() == '4':
181 self.action[4]()
182 elif evt.text() == '5':
183 self.action[5]()
184 elif evt.text() == '6':
185 self.action[6]()
186 elif evt.text() == '7':
187 self.action[7]()
188 elif evt.text() == '8':
189 self.action[8]()
190 elif evt.text() == '9':
191 self.action[9]()
192 # Ponto flutuante.
193 elif evt.text() == '.':
194 self.appendFloatPoint()
195 # Clear.
196 elif evt.key() == self.Key_Escape:
197 self.doClear()
198 # Backspace.
199 elif evt.key() == self.Key_Backspace:
200 self.doBackspace()
201 # Return e Enter (o 2° do teclado numérico)
202 elif evt.key() == self.Key_Return or evt.key() == self.Key_Enter:
203 self.doCalc()
204 # Operações matemáticas.
205 elif evt.text() == '+':
206 self.action['+']()
207 elif evt.text() == '-':
208 self.action['-']()
209 elif evt.text() == '*':
210 self.action['*']()
211 elif evt.text() == '/':
212 self.action['/']()
213 # Passa evento para que uma camada superior interprete.
214 else:
215 evt.ignore()
calc.py
1 # -*- coding: iso-8859-1 -*-
2
3 import sys, qt
4 import calcwidget
5
6 import calcform
7
8 class Calc(qt.QApplication):
9 """Define uma aplicação de calculadora.
10 """
11 def __init__(self, argv):
12 """Prepara e executa aplicação, a partir dos argumentos de linha de
13 comando passados.
14 """
15 super(Calc, self).__init__(argv)
16 mainWidget = calcwidget.CalcWidget()
17 self.setMainWidget(mainWidget)
18 mainWidget.show()
19 self.exec_loop()
20
21
22 def main():
23 Calc(sys.argv)
24
25 if __name__ == '__main__':
26 main()
Volta para CookBook.