当前位置:   article > 正文

Qt嵌入式开发的基本认识

qt嵌入式开发

目录

目录

1.Qt简介

2.Qt开发计算器的基本方法

2.1Qt常用快捷键

2.2QPushbutton的创建

 2.3.QPushButton按钮的显示

 2.4.使用栈和队列将中缀表达式转化为后缀表达式

2.5.数据的预处理

2.6.后缀表达式的四则运算

3.一些bug的处理

4.功能的实现

4.1.1Mod功能的实现

4.2.X^Y功能的实现

4.3.log功能的实现


1.Qt简介

Qt [1]  是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些,Qt很容易扩展,并且允许真正地组件编程。

2.Qt开发计算器的基本方法

2.1Qt常用快捷键

Qt常用快捷键
alt+anter自动创建类定义的实现
F1查看帮助文档
Shift + F2函数的声明和定义之间快速切换
F4在 cpp 和 h 文件切换
Ctrl + Enter 在当前行的下方插入空白行
Ctrl + /注释当前行 或者选中的区域
Ctrl + BBuild 项目
ctrl+D删除当前行
Ctrl + I自动缩进当前行,格式化代码
Ctrl +Shift + Enter到上一行添加空白行

2.2QPushbutton的创建

通过源文件wiget编写QPushbutton按钮和改变QPushbutton的大小与位置

  1. QPushButton*btn=new QPushButton;
  2. btn->show();//show以顶层方式弹出窗口控件
  3. btn->setParent(this);
  4. //显示文本
  5. btn->setText("第一个按钮");
  6. QPushButton*btn2=new QPushButton("第二个按钮",this);
  7. //移动btn2
  8. btn2->move(100,100);
  9. //重置窗口大小
  10. resize(1280,960);
  11. //设置固定的窗口大小
  12. setFixedSize(600,400);
  13. //设置窗口标题
  14. setWindowTitle("calculator");
  15. ui->setupUi(this);

 2.3.QPushButton按钮的显示

 以按钮4为例,通过字符和文本显示出按钮4:

  1. void Widget::on_fourButton_clicked()
  2. {
  3. expression+="4";
  4. ui->mainLineEdit->setText(expression);
  5. }

运行结果如下:

 2.4.使用栈和队列将中缀表达式转化为后缀表达式

以2*3+1为例,将数字放入队列queue中,操作符放入栈中。首先遍历表达式将数字直接放入队列中,如果遍历到操作符再判断优先级,如果当前操作符的优先级低于栈中操作符的优先级,则栈中操作符出栈入队列,反之则直接入栈,最后再判断栈中是否为空,如果为不为空,则出栈直至栈空为止。

第一步:

queuestack
2*

第二步:

queuestack
1+
*
3
2

第三步:

queuestack
+
1
*
3
2

以+、-*、/为例,通过优先级的大小,可以知道+、-是一级,*、/是2级可以得出函数

  1. int Judge(QChar ch)
  2. {
  3. if(ch=='+'||ch=='-')return 1;
  4. if(ch=='*'||ch=='/')return 2;
  5. }

  1. for(int i=0;i<pre_expression.size();i++){
  2. if(pre_expression[i][0]<='9'&&pre_expression[i][0]>='0'){
  3. q.push(pre_expression[i]);
  4. }
  5. else {
  6. if(s.empty()&&pre_expression[i][0]!='(')s.push(pre_expression[i]);//如果栈是空的直接入栈
  7. else
  8. {
  9. //栈是非空的,依次弹出栈中优先级高于或者等于当前运算符的所有运算符
  10. //再把当前运算符入栈
  11. //如果当前运算符是+,*,-,/,log,^
  12. if(pre_expression[i][0]=='l'||pre_expression[i][0]=='^'||pre_expression[i][0]=='%'||pre_expression[i][0]=='+'||pre_expression[i][0]=='-'||pre_expression[i][0]=='*'||pre_expression[i][0]=='/')
  13. {
  14. while(!s.empty()&&s.top()!="("){//当遇到(或者栈空则停止
  15. //依次弹出栈中优先级栈中优先级高于或者等于当前运算符的所有运算符
  16. if(Judge(pre_expression[i][0])<=Judge(s.top()[0])){
  17. QString temp=s.top();
  18. s.pop();
  19. q.push(temp);
  20. //break;
  21. }
  22. else break;
  23. }
  24. s.push(pre_expression[i]);
  25. }
  26. }
  27. }

如果最后栈中还是非空的话就可以直接出栈

  1. //如果栈非空,则把栈中元素pop,放入队列中
  2. while(!s.empty()){
  3. QString temp=s.top();
  4. q.push(temp);
  5. s.pop();
  6. }

2.5.数据的预处理

由于输入的操作数是字符串,因此应该对数据进行预处理。以23+56为例,应该把输入的字符串分为23,+,56三个部分。首先定义一个字符数组pre_expression,可以将数据分组完成后按顺序加入字符数组。

pre_expression数据
pre_expression[0]23
pre_expression[1]+
pre_expression[2]56

代码段:

  1. vector<QString> pre_expression;
  2. //遍历expression
  3. for(int i=0;i<expression.size();i++)
  4. {
  5. //如果遇到的第一个数是数字或者小数点
  6. if(expression[i]<='9'&&expression[i]>='0'){
  7. QString t;
  8. if(expression[i]<='9'&&expression[i]>='0'){
  9. for(int j=i;j<expression.size();j++){
  10. if((expression[j]<='9'&&expression[j]>='0')||expression[i]=='.'){
  11. t+=expression[j];
  12. i++;
  13. }
  14. else{
  15. i--;
  16. break;
  17. }
  18. }
  19. }
  20. //将字符串t赋值给pre_expression
  21. pre_expression.push_back(t);
  22. }
  23. else {
  24. //如果遇到操作符则直接给pre_expression
  25. QString t;
  26. t.push_back(expression[i]);
  27. pre_expression.push_back(t);
  28. }
  29. }

2.6.后缀表达式的四则运算

由于所有的符号都在队列中,于是可以再用一个栈。对于所有的数字直接出队列入栈,然后如果碰到操作符,可以对栈顶2个元素进行处理,最终的栈顶元素就是答案。以2*3+1为例子。

第一步:

queuestack
+3
12
*

第二步:

queuestack
+6
1

第三步:

queuestack
7

3.一些bug的处理

1.如果有操作符是栈中元素只有1个,以+为例:

  1. if(s.size()>=2){
  2. double a=s.top();
  3. s.pop();
  4. double b=s.top();
  5. s.pop();
  6. b+=a;
  7. s.push(b);
  8. q.pop();
  9. }
  10. else return "error";

2.当队列为空时:

  1. if(q.empty()){
  2. q.push("error");
  3. }
  4. else return q;

3.当(和)数量不匹配时:

  1. int count=0;
  2. for(int i=0;i<expression.size();i++){
  3. if(expression[i]=='(')count++;
  4. else if(expression[i]==')')count--;
  5. if(count<0){
  6. expression+="error";
  7. break;
  8. }
  9. }
  10. if(count>0){
  11. for(int i=0;i<count;i++)expression+=')';
  12. }

4.当(之后直接输入-时:

  1. int p=i+1;
  2. if(p<pre_expression.size()&&pre_expression[p][0]=='-'&&s.top()=='('){
  3. q.push("0");
  4. }

5当第一个字符是-时:

if(pre_expression[0]=="-")pre_expression.insert(pre_expression.begin(),"0");

6当不能连续输入操作符时:

if(expression.right(1)=="l"||expression.right(1)=="^"||expression.right(1)=="%"||expression.right(1)=="+"||expression.right(1)=="-"||expression.right(1)=="*"||expression.right(1)=="/"||expression.right(1)==".")return;

4.功能的实现

4.1.1Mod功能的实现

  1. else if(q.front()=="%"){
  2. if(s.size()>=2){
  3. double a=s.top();
  4. s.pop();
  5. double b=s.top();
  6. s.pop();
  7. b=b-int(b/a)*a;
  8. s.push(b);
  9. q.pop();
  10. }
  11. else return "error";
  12. }

4.2.X^Y功能的实现

  1. else if(q.front()=="^"){
  2. if(s.size()>=2){
  3. double a=s.top();
  4. s.pop();
  5. double b=s.top();
  6. s.pop();
  7. b=pow(b,a);
  8. s.push(b);
  9. q.pop();
  10. }
  11. else return "error";
  12. }

4.3.log功能的实现

由于换底公式lga/lgb就可以得到以b为底a为真数的值,因此该计算器log函数就是以这样的操作数为原理。

  1. else if(q.front()=="l"){
  2. if(s.size()>=2){
  3. double a=s.top();
  4. s.pop();
  5. double b=s.top();
  6. s.pop();
  7. b=log(b)/log(a);
  8. s.push(b);
  9. q.pop();
  10. }
  11. else return "error";
  12. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/95234
推荐阅读
相关标签
  

闽ICP备14008679号