0%

Clion环境Qt简单示例程序:计算器

效果预览:
在这里插入图片描述

新建项目

Qt CMake前缀路径选择Qt路径下面的mingw文件夹。
在这里插入图片描述

新建Qt UI类

在这里插入图片描述
在这里插入图片描述

用Qt Designer对界面进行布局

(对于QtDesigner如何添加到Clion中,可以参考这篇博客
在这里插入图片描述

布局如下,其中上面的文字框是Line Edit控件,按钮为Push Button。在这里插入图片描述
对每个控件进行调整、命名:
在这里插入图片描述
可以调整按钮及文本框中的字体及大小、对齐方式:
在这里插入图片描述
这里文本框选择右下角对齐。
在这里插入图片描述
对.ui文件运行UIC(添加UIC与添加QtDesigner类似,可以自行搜索)
在这里插入图片描述

在.h文件中添加slots,在.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
void mainwin::Btn_onClick() {
QPushButton *btn = (QPushButton*)sender();
QString name = btn->objectName();//获取发送信息的按钮名

QLineEdit *le = ui->lineEdit;
QString text = le->text();//获取当前文本框的表达式
if(text == "ERROR") text="";

if(name == "Btn1"){
text += "1";
}
else if(name == "Btn2"){
text += "2";
}
else if(name == "Btn3"){
text += "3";
}
else if(name == "Btn4"){
text += "4";
}
else if(name == "Btn5"){
text += "5";
}
else if(name == "Btn6"){
text += "6";
}
else if(name == "Btn7"){
text += "7";
}
else if(name == "Btn8"){
text += "8";
}
else if(name == "Btn9"){
text += "9";
}
else if(name == "zero"){
text += "0";
}

else if(name == "plus"){
text += "+";
}
else if(name == "minus"){
text += "-";
}
else if(name == "times"){
text += "*";
}
else if(name == "divide"){
text += "/";
}
else if(name == "AC"){
text = "";
}
else if(name == "equals"){//开始计算,若出现错误返回ERROR
double answer = Expression(text.toStdString()).val();
if(answer == Expression::ERROR)
{
le->setText("ERROR");
return;
}
text = QString::fromStdString(std::to_string(answer));
}
else if(name == "DEL"){
if(name.size() == 0) return;
std::string tmp = text.toStdString();
tmp.erase(tmp.end()-1);
text = QString::fromStdString(tmp);
}
else if(name == "dot"){
text += ".";
}
else if(name == "lb"){
text += "(";
}
else if(name == "rb") {
text += ")";
}
le->setText(text);
}

附上expression.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
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
//
// Created by ROG on 2021/9/28.
//

#ifndef CALC_EXPRESSION_H
#define CALC_EXPRESSION_H

#include <stack>
#include <QDebug>
using std::stack;
class Expression
{
private:

static constexpr int MAXN = 101;

int len;
char s[MAXN];

public:
static constexpr double ERROR = -2e9;
Expression(){}
Expression(std::string str)
{
for(int i=0;i<str.size();i++)
s[i+1] = str[i];
s[str.size()+1] = '\0';
len = str.size();
}

short ord(char ch)
{
if(ch == '(' || ch == ')') return 0;
if(ch == '+' || ch == '-') return 1;
if(ch == '*' || ch == '/') return 2;
if(ch == '~') return 3;
}
bool isNum(char ch)
{
return ch>='0' && ch<='9';
}
bool isOperator(char ch)
{
return ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '~';
}
bool Check()
{
int p = 0,cnt = 0;
char *str = new char[len<<1];
stack<char> S;
s[0] = '+';
while(s[++p] != '\0')
{
if(s[p] == '(')
{
S.push('(');
str[++cnt] = '(';
}
else if(s[p] == ')')
{
if(S.empty()) return false;
else S.pop();
str[++cnt] = ')';
}
else if(s[p] == '-')
{
if(p == 1 || isOperator(s[p-1]) || str[p-1] == '(')
{
str[++cnt] = '~';
}
else str[++cnt] = '-';
}
else if(isOperator(s[p]) && isOperator(s[p-1])) return false;
else if(isNum(s[p]) || s[p] == '.' || isOperator(s[p]))
str[++cnt] = s[p];
}
if(!S.empty()) return false;
for(int i=1;i<=cnt;i++)
s[i] = str[i];
s[cnt+1] = '\0';
len = cnt;
delete[] str;
return true;
}
char *Transform()
{
int cnt = 0;
stack<char> st;
char *exp = new char[len<<1];

for(int i=1;i<=len;i++)
{
if(isNum(s[i-1]) && !isNum(s[i]) && s[i] != '.') exp[++cnt] = '#';
if(isNum(s[i]))
exp[++cnt] = s[i];
else if(s[i] == '.') exp[++cnt] = s[i];
else if(s[i] == '(')
{
st.push('(');
}
else if(s[i] == ')')
{
while(st.top() != '(')
{
exp[++cnt] = st.top();
st.pop();
}
st.pop();
}
else if(isOperator(s[i]))
{
while(!st.empty())
{
if(ord(s[i])>ord(st.top()) || s[i] == '~')
{
st.push(s[i]);
break;
}
else
{
exp[++cnt] = st.top();
st.pop();
}
}
if(st.empty()) st.push(s[i]);
}
}
if(isNum(s[len])) exp[++cnt] = '#';
while(!st.empty())
{
exp[++cnt] = st.top();
st.pop();
}
exp[++cnt] = '\0';
return exp;
}
double val()
{
bool check = Check();
if(!check) return ERROR;
char *exp = Transform();
char p = 0;
double val = 0;
double dval = 0;
double base = 10;
bool number = false;
stack<double> st;
while(exp[++p] != '\0')
{
if(exp[p]>='0' && exp[p]<='9')
{
if(number)
{
dval += (exp[p]-'0')/base;
base *= 10;
}
else val = val*10+exp[p]-'0';
}
else if(exp[p] == '.')
{
number = true;
}
else if(isOperator(exp[p]))
{
double b = st.top();
st.pop();
double a;
switch(exp[p])
{
case '+':
a = st.top();
st.pop();
st.push(a+b);

break;
case '-':
a = st.top();
st.pop();
st.push(a-b);
break;
case '*':
a = st.top();
st.pop();
st.push(a*b);
break;
case '/':
a = st.top();
st.pop();
if(b == 0)
{
return ERROR;
}
st.push(a/b);
break;
case '~':
st.push(-b);
break;
}
}
else if(exp[p] == '#')
{
st.push(val+dval);
val = 0;
dval = 0;
base = 10;
number = false;
}
}
delete exp;
return st.top();
}
};

#endif //CALC_EXPRESSION_H


在Qt Designer中把按钮连接到函数:

(Clion里似乎与Qt Creator环境中步骤不相同)
点击上方”编辑信号/槽”:
在这里插入图片描述
点击按钮并把出来的连线拖到面板上:
在这里插入图片描述
分别点击clicked()和刚才编写的函数:
在这里插入图片描述

对所有按钮重复上述步骤。

稍微修改main.cpp:

在这里插入图片描述

运行程序

在这里插入图片描述

打包程序

若想将将程序打包成release版,电脑上不需要有Qt环境也能运行,需要添加release配置:
点击文件→设置→构建、执行、部署→CMake→”+”,会自动生成一个release配置。
![在这里插入图片描述](https://img-blog.csdnimg.cn/7be6c5bd74aa4c14bc60355b14b8aed2.png?x-oss-process=image,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5LiD54-t56eR6ZW_55Sy,size_20,color_FFFFFF,t_70,g_se,x_16
在右上角调为release:
在这里插入图片描述
再次运行程序,在工程文件夹的cmake-build-release文件夹下找到calc.exe:
在这里插入图片描述
将exe文件复制到另一个想要打包到的路径中,如Desktop/calc中:
在这里插入图片描述
在应用中找到Qt的命令行程序:
在这里插入图片描述
输入cd /d [路径],进入刚才新建的文件夹:
在这里插入图片描述
输入windeployqt 程序名.exe –release命令,进行打包:
(若不加–release,有可能打包出debug版本,一个计算器将近1G)
在这里插入图片描述
现在程序可以在无Qt环境中运行了。
在这里插入图片描述