avatar

Qt作业一:计算器

ui界面对应的ui_*.h文件的作用:

ui_.h是ui界面的代码化表达,
即用非Qt软件打开ui文件时会显示ui_*.h文件,用代码描述ui界面内容


计算器程序:

1.通过Qt designer设计界面:

image_1deo6ig6qdpc1jdn1h1te6e1sk01m.png-236.7kB

出现的问题和解决方法:

  • 窗口对象名(QWidget类)要和对窗口进行操作的父类类名一致,否则会提示“引用了不完整的类型”
  • 注意修改按钮名称以便下一步

2.使用QSignalMapper:

signalmapper=new QSignalMapper (this);
QObjectList list =this->children();//list为全部按钮
foreach(QObject *oc,list)//遍历list中的按钮
{
if(oc->objectName()!="gridLayout"&&oc->objectName()!="display"&&oc->objectName()!="")//排除不需要链接槽函数clicked()的多余按钮
{
QPushButton *pushbutton=qobject_cast<QPushButton *>(oc);//利用qobject——cast进行类型转换
connect(pushbutton,SIGNAL(clicked()),signalmapper,SLOT(map()));//将信号链接到signnalmapper上
signalmapper->setMapping(pushbutton,pushbutton->text());
}

}
connect(signalmapper,SIGNAL(mapped(QString)),this,SLOT(clicked(QString)));//将signalmapper连接至槽函数clicked(QString)上,即实现将所需按钮链接至一个槽函数

出现的问题和解决方法:

  • 理解QSignalMapper的工作原理和方法:
    qsignalmapper:相当于一个信号转发器,将多个按钮信号连接到一个槽函数上(详见代码注释)
    引入QSignalMapper头文件
    还有一种获取按钮列表的方法:
    QString buttontext = "btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10"; 
    QStringList texts = buttontext.split(",");
    也可利用按钮名字的共性筛选出所需要的按钮:
    if(oc->nbjectName.starswith("***")
  • 最初设计ui时将所有按钮放到了gridlayout下,结果到至按钮无法访问,将按钮挪出gridlayout,若需使按钮排列整齐,designer界面上方有辅助排列功能按键。

###3.计算功能的实现:
头文件声明:

  • node类
    class node
{
public:
node();
double data;//字符串转成double后存储在data中
QString sign;//如果时运算符节点,用sign记录运算符
QString nums;//以字符串形式存储double类型的数据
node* next;
};
  • widget类://计算器类

image_1den8jsp2cvi120b1183p941e3tm.png-194.6kB

  • 将按钮上的内容输入到字符串中:
    void Widget::clicked(QString ch)
    {
    if(ch=="sqrt")
    opt.append("k");
    else if(ch=="square")
    opt.append("p");
    else if(ch=="rev")
    opt.append("d");
    else if(ch=="neg")
    opt.append("f");
    else if(ch=="=")
    {
    opt.append("=\0");
    cal();
    }
    else {
    opt.append(ch);
    }
    ui->display->setPlainText(opt);//显示输入内容
    }
  • 将字符串转成链表
    image_1den9fkk8r1mvuu2cn130g14c21g.png-198kB
    • QString 转 double:
      t->data=t->nums.toDouble;
  • 实现节点与节点的计算
    void Widget::calculate(node*a,node*b,node*c)
    {
    if (b->sign == '+')
    a->data = a->data + c->data;
    if (b->sign == '-')
    a->data = a->data - c->data;
    if (b->sign == '*')
    a->data = a->data * c->data;
    if (b->sign == '/')
    a->data = a->data / c->data;
    //节点合并
    if (tail != c)
    {
    a->next=c->next;
    }
    else
    {
    a->next=nullptr;
    tail=a;
    }
    }
    void Widget::  calculate(node*a,node*b)
    {
    if (b->sign == 'k')
    a->data = sqrt(a->data);
    if (b->sign == 'p')
    a->data *= a->data;
    if (b->sign == 'd')
    a->data = 1 / a->data;
    if (b->sign == 'f')
    a->data = -a->data;
    if(b!=tail)
    a->next = b->next;
    else
    {
    a->next = nullptr;
    tail = a;
    }
    }
  • 计算样例
    image_1deo6udbc13io132bduhi37lcs1c.png-194.7kB
    image_1deo711q21576823lu110ue3l81p.png-198.2kB
Author: Michelle19l
Link: https://gitee.com/michelle19l/michelle19l/2019/08/31/Qt/Qt作业一/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶