Qt(C++)实现的简易计算器

本文最后更新于:2 年前

这其实是个过时的版本,我恬不知耻的把这个挂咸鱼上卖了,然后被各路买家测出了一堆乱七八糟的bug,代码更新迭代了很多次,懒得再粘过来了,说起来我3块钱卖一份代码还包售后属实很良心了。(自卖自夸.jpg)

声明

本文档的一切内容均为本地测试结果,受限于本人知识与能力,仅供参考,如因参照本文档操作而发生任何问题,无论是否严格参照本文档操作,请恕本人概不负责。

文档中的任何观点受限于本人知识、能力及眼界,不保证理智,公正,客观。如本文档中观点与您相左,以您的意见为准。

前言

软件工程的作业,让写一个计算器,为此花两天抽时间看了看Qt入门,然后就开搞了。

1
环境Qt 5.13.1,MinGw 7.3.0 32-bit,IDE:Qt Creator 4.10.0

新建Qt Widgets 应用,项目名称Calculator,基类选择GWidget,类名MyWidget。

界面

首先是页面,直接拖拖拖,没用栅格,先垂直在水平布局了,改了一点参数,解决问题。

界面

代码

编写信号和槽,并代码实现计算器功能

mywidget.h 最终更改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <string.h>
#include <stdio.h>
#include <QDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE

class QErrorMessage;

class MyWidget : public QWidget
{
Q_OBJECT

public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();

private slots:
void on_pushButtonCe_clicked();

void on_pushButtonC_clicked();

void on_pushButtonDe_clicked();

void on_pushButtonChu_clicked();

void on_pushButton7_clicked();

void on_pushButton8_clicked();

void on_pushButton9_clicked();

void on_pushButtonChen_clicked();

void on_pushButton4_clicked();

void on_pushButton5_clicked();

void on_pushButton6_clicked();

void on_pushButtonJian_clicked();

void on_pushButton1_clicked();

void on_pushButton2_clicked();

void on_pushButton3_clicked();

void on_pushButtonJia_clicked();

void on_pushButtonHuan_clicked();

void on_pushButton0_clicked();

void on_pushButtonDian_clicked();

void on_pushButtonDenyu_clicked();

void AddNum(int i);

void ShowNum();

void Operator(int i);

void TwiceOperator();

double OpreatorTrue();

void DToStr(double c);

private:
Ui::MyWidget *ui;
QErrorMessage * errordlg;
char showstr[100];
double a = 0, b = 0;
int cha = 0, wei = 10, showlen=0, oper;
bool sign = false, signdian = false, starta = false, startb = false, signa = true, signb = true;
};
#endif // MYWIDGET_H

mywidget.cpp 最终更改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QtDebug>
#include<string>
#include<QString>
#include<QErrorMessage>

const double lin = 0.0000000001;

MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
errordlg = new QErrorMessage(this);
}

MyWidget::~MyWidget()
{
delete ui;
}

void MyWidget::DToStr(double c){
sprintf(showstr, "%.8lf", c);
showstr[8] = '\0';
showlen = 8;
for(int i=showlen-1; i>0; i--){
if(showstr[i] == '0'){
showstr[i] = '\0';
showlen--;
}else if(showstr[i] == '.'){
showstr[i] = '\0';
showlen--;
break;
}else{
break;
}
}
}

void MyWidget::ShowNum(){
qDebug() << showstr;
if(showlen == 0){
ui->lcdNumber->display(0);
}else{
ui->lcdNumber->display(showstr);
}
}

void MyWidget::AddNum(int i){
showstr[showlen++] = char(48+i);
showstr[showlen] = '\0';
if((signdian && showlen == 10) || (!signdian && showlen == 9)){
errordlg->setWindowTitle(tr("错误提示"));
errordlg->showMessage(tr("输入超限"));
showstr[--showlen] = '\0';
return;
}
cha = i;
if(!sign){
if(!starta){
showstr[0] = char(48+i);
showstr[1] = '\0';
showlen = 1;
starta = true;
}
if(signdian){
a = a + double(i) / wei;
wei *= 10;
}else{
a = a * 10 + i;
}
}else{
if(!startb){
showstr[0] = char(48+i);
showstr[1] = '\0';
showlen = 1;
startb = true;
}
if(signdian){
b = b + double(i) / wei;
wei *= 10;
}else{
b = b * 10 + i;
}
}
ShowNum();
}

void MyWidget::on_pushButtonCe_clicked()
{
if(sign){
TwiceOperator();
b = 0;
wei = 10;
signdian = false;
startb = false;
DToStr(b);
ShowNum();
}else{
a = 0;
wei = 10;
signdian = false;
starta = false;
DToStr(a);
ShowNum();
}
}

void MyWidget::on_pushButtonC_clicked()
{
a = 0; b = 0;
cha = 0; wei = 10; showlen=0; oper=0;
showstr[0] = '\0';
sign = false; signdian = false; starta = false; startb = false; signa = true; signb = true;
DToStr(0.0);
ShowNum();
}

void MyWidget::on_pushButtonDe_clicked()
{
if(!sign){
if(signdian){
a = a * wei / 10;
a -= cha;
a /= wei;
wei /= 10;
if(wei == 1){
signdian = false;
wei = 10;
//showstr[--showlen] = '\0';
}
}else{
a -= cha;
a /= 10;
cha = int(a) % 10;
}
}else{
if(signdian){
b = b * wei;
b -= cha;
cha = (int(b) % 100) / 10;
b /= wei;
wei /= 10;
if(wei == 1){
signdian = false;
wei = 10;
}
}else{
b -= cha;
b /= 10;
cha = int(b) % 10;
}
}
if(showlen>0){
showstr[--showlen] = '\0';
}
ShowNum();
}

double MyWidget::OpreatorTrue(){
switch (oper) {
case 1 : return a + b;
case 2 : return a - b;
case 3 : return a * b;
case 4 : {
if(b>=-lin && b<=lin){
errordlg->setWindowTitle(tr("错误提示"));
errordlg->showMessage(tr("除数不能为0"));
return a;
} return a / b;
}
}
return a;
}

void MyWidget::TwiceOperator(){
b = 0;
signb = true;
signa = true;
starta = true;
startb = false;
wei = 10;
showlen=0;
showstr[0] = '\0';
signdian = false;
}

void MyWidget::Operator(int i){
switch(i){
case 1:{
if(sign){
if(!signa) a = 0 - a;
if(!signb) b = 0 - b;
a = OpreatorTrue();
TwiceOperator();
oper = 1;
DToStr(a);
ShowNum();
}else{
if(!signa) a = 0 - a;
oper = 1;
sign = true;
TwiceOperator();
}
} break;
case 2:{
if(sign){
if(!startb){
startb = true;
signb = false;
showstr[0] = '-';
showstr[++showlen] = '\0';
ShowNum();
}else{
if(!signa) a = 0 - a;
if(!signb) b = 0 - b;
a = OpreatorTrue();
TwiceOperator();
oper = 2;
DToStr(a);
ShowNum();
}
}else{
if(!starta){
starta = true;
signa = false;
showstr[0] = '-';
showstr[++showlen] = '\0';
ShowNum();
}else{
if(!signa) a = 0 - a;
oper = 2;
TwiceOperator();
sign = true;
}
}
} break;
case 3:{
if(sign){
if(!signa) a = 0 - a;
if(!signb) b = 0 - b;
a = OpreatorTrue();
TwiceOperator();
oper = 3;
DToStr(a);
ShowNum();
}else{
if(!signa) a = 0 - a;
oper = 3;
TwiceOperator();
sign = true;
}
} break;
case 4:{
if(sign){
if(!signa) a = 0 - a;
if(!signb) b = 0 - b;
a = OpreatorTrue();
TwiceOperator();
oper = 4;
DToStr(a);
ShowNum();
}else{
if(!signa) a = 0 - a;
oper = 4;
TwiceOperator();
sign = true;
}
} break;
}
}

void MyWidget::on_pushButtonHuan_clicked()
{
if(sign){
if(startb){
if(signb){
signb = false;
for(int i=(++showlen); i>0; i--){
showstr[i] = showstr[i-1];
}
showstr[0] = '-';
ShowNum();
}else{
signb = true;
for(int i=0; i<showlen; i++){
showstr[i] = showstr[i+1];
}
showlen--;
ShowNum();
}
}else{
startb = true;
signb = false;
showstr[0] = '-';
showstr[++showlen] = '\0';
ShowNum();
}
}else{
if(starta){
if(signa){
signa = false;
for(int i=(++showlen); i>0; i--){
showstr[i] = showstr[i-1];
}
showstr[0] = '-';
ShowNum();
}else{
signa = true;
for(int i=0; i<showlen; i++){
showstr[i] = showstr[i+1];
}
showlen--;
ShowNum();
}
}else{
starta = true;
signa = false;
showstr[0] = '-';
showstr[++showlen] = '\0';
ShowNum();
}
}
}

void MyWidget::on_pushButtonDian_clicked()
{
if(!signdian){
signdian = true;
showstr[showlen++] = '.';
showstr[showlen] = '\0';
ShowNum();
}
}

void MyWidget::on_pushButtonDenyu_clicked()
{
if(sign){
sign = false;
if(!signa) a = 0 - a;
if(!signb) b = 0 - b;
a = OpreatorTrue();
TwiceOperator();
DToStr(a);
ShowNum();
}else{
if(!signa) a = 0 - a;
TwiceOperator();
sign = true;
}
}

void MyWidget::on_pushButton1_clicked()
{
AddNum(1);
}

void MyWidget::on_pushButton2_clicked()
{
AddNum(2);
}

void MyWidget::on_pushButton3_clicked()
{
AddNum(3);
}

void MyWidget::on_pushButton4_clicked()
{
AddNum(4);
}

void MyWidget::on_pushButton5_clicked()
{
AddNum(5);
}

void MyWidget::on_pushButton6_clicked()
{
AddNum(6);
}

void MyWidget::on_pushButton7_clicked()
{
AddNum(7);
}

void MyWidget::on_pushButton8_clicked()
{
AddNum(8);
}

void MyWidget::on_pushButton9_clicked()
{
AddNum(9);
}

void MyWidget::on_pushButton0_clicked()
{
AddNum(0);
}

void MyWidget::on_pushButtonChu_clicked()
{
Operator(4);
}

void MyWidget::on_pushButtonChen_clicked()
{
Operator(3);
}

void MyWidget::on_pushButtonJian_clicked()
{
Operator(2);
}

void MyWidget::on_pushButtonJia_clicked()
{
Operator(1);
}

收尾

到这就没啥了,改一下项目文件啥的换个图标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
main.cpp \
mywidget.cpp

HEADERS += \
mywidget.h

FORMS += \
mywidget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RC_ICONS = Calculator.ico

TARGET = Calculator
TEMPLATE = app

成品

放两张效果图

最后附上所有文件的资源链接:资源链接


Qt(C++)实现的简易计算器
https://www.jingshan256.com/qt_calculator/
作者
origincat
发布于
2020年1月7日
许可协议