【QT】使用QML构建一个简易的计算器界面(一)

使用qml来构建一个界面是非常便捷的,熟悉其中组件的使用,构建一个界面就不是难事。
首先来看如何快速的创建一个计算器的基础界面;
先新建一个qt quick项目,运行可以得到一个空白的窗口,根据自己设计的计算器来设计大小和布局按钮,这里就按电脑自带的计算器界面来进行设计和布局,先看电脑的计算器窗口如下:(大概标准按如下设计)在这里插入图片描述
先进行简单的计算器设计,只包含加减乘除四种运算;
main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 400
    height: 640
    title: qsTr("计算器")

    property string txtString: ""


    //用于显示输入的键值和得出的运行结果
    Rectangle {
        id:textDisp;

        width:parent.width;
        height:0.4*parent.height;
        anchors.top:parent.top;
        anchors.left: parent.left;
        color: "#fcfcd5";

        Text {
            text: txtString;
            font.pixelSize: 25;
            wrapMode: Text.WrapAnywhere;
        }
    }

    //放置按钮区域
    Rectangle{
        id:btnArea;
        width:parent.width;
        height:parent.height - textDisp.height - 10;
        anchors.top:textDisp.bottom;
        anchors.topMargin: 5;
        anchors.left: parent.left;
        border.width: 1;

        property int heightTmp: height / 4;
        property int fontSize: 20;

        Column {
            anchors.fill: parent;
            spacing: 5;

            Row {
                height: btnArea.heightTmp - 5;
                width:parent.width - 5;
                spacing: 5;
                Button {
                    id:seven
                    text: "7";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "7";
                    }
                }
                Button {
                    id:eight
                    text: "8"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "8";
                    }
                }
                Button {
                    id:night
                    text: "9"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "9";
                    }

                }
                Button {
                    id:ride
                    text: "×";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "×";
                    }
                }
            }

            Row {
                height: btnArea.heightTmp;
                width:parent.width;
                spacing: 5;
                Button {
                    id:four
                    text: "4";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "4";
                    }
                }
                Button {
                    id:five
                    text: "5"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "5";
                    }
                }
                Button {
                    id:six
                    text: "6"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "6";
                    }

                }
                Button {
                    id:add
                    text: "-";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "-";
                    }

                }
            }


            Row {
                height: btnArea.heightTmp;
                width:parent.width;
                spacing: 5;
                Button {
                    id:one
                    text: "1";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "1";
                    }
                }
                Button {
                    id:two
                    text: "2"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "2";
                    }
                }
                Button {
                    id:three
                    text: "3"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "3";
                    }

                }
                Button {
                    id:sub
                    text: "+";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "+";
                    }

                }
            }

            Row {
                height: btnArea.heightTmp;
                width:parent.width;
                spacing: 5;
                Button {
                    id:divide
                    text: "÷";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "÷";
                    }
                }
                Button {
                    id:zero
                    text: "0"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "0";
                    }
                }
                Button {
                    id:clean
                    text: "Clean"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString = "";
                    }

                }
                Button {
                    id:eq
                    text: "=";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        sum();
                    }

                }
            }
        }
    }

    function sum()
    {
        //判断是否包含字符 str.indexOf();
        var sum = 0;
        var array;

        //拆分字符串
        if(txtString.indexOf("+") !== -1)
        {
             array = txtString.split("+");
            for(var i = 0; i < array.length; i++)
            {
                sum += parseInt(array[i], 10);
            }
        }

        if(txtString.indexOf("-") !== -1)
        {
             array = txtString.split("-");
            for(var i = 0; i < array.length; i++)
            {
                if(i === 0)
                    sum = parseInt(array[i], 10);
                else
                    sum -= parseInt(array[i], 10);
            }
        }

        if(txtString.indexOf("÷") !== -1)
        {
            sum = 1;
             array = txtString.split("÷");
            for(var i = 0; i < array.length; i++)
            {
                for(var i = 0; i < array.length; i++)
                {
                    if(i === 0)
                        sum = parseInt(array[i], 10);
                    else
                        sum /= parseInt(array[i], 10);
                }
            }
        }

        if(txtString.indexOf("×") !== -1)
        {
            sum = 1;
             array = txtString.split("×");
            for(var i = 0; i < array.length; i++)
            {
                sum *= parseInt(array[i], 10);
            }
        }

        txtString = sum;
    }


}

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

目前只完成了简单的运算,对于复合运算,包含小数,正负数的运算还没有实现,接下来继续实现关于其他运算的方法,界面目前有点丑,但不影响使用,后续再进行优化;
目前是将运算过程和界面内容都放在qml中来实现的,对于逻辑运算是使用的Javascript来进行的,但是qml被创建出来的目的不是如此,将c++和qml解耦出来是更希望用qml做界面设计,而使用c++做后端逻辑运算以及数据处理;这里就将这部分代码调整一下,使用c++来做运算逻辑过程,qml单纯的只做界面设计展示,当然对于一下简单的项目,界面与逻辑不复杂的设计,再qml即实现ui和后端逻辑的设计也无可厚非。
qt是提供一个类来进行表达式运算的,直接将表达式传入就可以获取输出的值,这个表达式的解析算法就不需要自己来实现了,挺方便的,有时间也可以自己去实现这个算法。
qt提供实现计算表达式的类是一个qt的script模块,要想使用这个模块需要先在.pro文件里面加上:

QT += script

基本用法很简单,创建QScriptEngine并调用器evaluate()函数,将要计算的表达式作为参数传递,返回的值就是求取的值。关于这个类的其他功能就不说了,下面来看引入c++之后的qt代码:
先添加一个自定义的Calc的类,calc.cpp和calc.h两个文件
calc.cpp

#include "calc.h"
#include <QDebug>
#include <QScriptEngine>


Calc::Calc(QObject *parent) : QObject(parent)
{

}

QString Calc::getValue(QString inputStr)
{
    if(inputStr.isEmpty())
        return "";
    qDebug() << "输入的表达式:" << inputStr;
    QScriptEngine myEngine;
    QScriptValue value = myEngine.evaluate(inputStr);

    m_value = value.toString();
    qDebug() << "得出的计算结果:" << m_value;
    return m_value;
}

calc.h

#ifndef CALC_H
#define CALC_H

#include <QObject>

class Calc : public QObject
{
    Q_OBJECT
public:
    explicit Calc(QObject *parent = nullptr);

    Q_INVOKABLE QString getValue(QString inputStr);

signals:

public slots:

private:
    QString m_value;
};

#endif // CALC_H

然后main文件里面注册该c++类到qml,使qml文件可以调用该类提供的函数。

再main.cpp里面添加这两行代码:

#include “calc.h"

void main()
{
		***
    //注册c++类到qml
    qmlRegisterType<Calc>("C2Qml", 1, 0, "Calc");
    ***
}

改动一下main.qml文件,去掉js写的技术方法,引入c++类:
main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import C2Qml 1.0

Window {
    visible: true
    width: 400
    height: 640
    title: qsTr("计算器")

    property string txtString: ""

    Calc {
        id:calc;
    }


    //用于显示输入的键值和得出的运行结果
    Rectangle {
        id:textDisp;

        width:parent.width;
        height:0.4*parent.height;
        anchors.top:parent.top;
        anchors.left: parent.left;
        color: "#fcfcd5";

        Text {
            text: txtString;
            font.pixelSize: 25;
            wrapMode: Text.WrapAnywhere;
        }
    }

    //放置按钮区域
    Rectangle{
        id:btnArea;
        width:parent.width;
        height:parent.height - textDisp.height - 10;
        anchors.top:textDisp.bottom;
        anchors.topMargin: 5;
        anchors.left: parent.left;
        border.width: 1;

        property int heightTmp: height / 4;
        property int fontSize: 20;

        Column {
            anchors.fill: parent;
            spacing: 5;

            Row {
                height: btnArea.heightTmp - 5;
                width:parent.width - 5;
                spacing: 5;
                Button {
                    id:seven
                    text: "7";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "7";
                    }
                }
                Button {
                    id:eight
                    text: "8"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "8";
                    }
                }
                Button {
                    id:night
                    text: "9"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "9";
                    }

                }
                Button {
                    id:ride
                    text: "×";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "*";
                    }
                }
            }

            Row {
                height: btnArea.heightTmp;
                width:parent.width;
                spacing: 5;
                Button {
                    id:four
                    text: "4";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "4";
                    }
                }
                Button {
                    id:five
                    text: "5"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "5";
                    }
                }
                Button {
                    id:six
                    text: "6"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "6";
                    }

                }
                Button {
                    id:add
                    text: "-";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "-";
                    }

                }
            }


            Row {
                height: btnArea.heightTmp;
                width:parent.width;
                spacing: 5;
                Button {
                    id:one
                    text: "1";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "1";
                    }
                }
                Button {
                    id:two
                    text: "2"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "2";
                    }
                }
                Button {
                    id:three
                    text: "3"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "3";
                    }

                }
                Button {
                    id:sub
                    text: "+";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "+";
                    }

                }
            }

            Row {
                height: btnArea.heightTmp;
                width:parent.width;
                spacing: 5;
                Button {
                    id:divide
                    text: "÷";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "/";
                    }
                }
                Button {
                    id:zero
                    text: "0"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString += "0";
                    }
                }
                Button {
                    id:clean
                    text: "Clean"
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString = "";
                    }

                }
                Button {
                    id:eq
                    text: "=";
                    height:parent.height;
                    font.pixelSize: btnArea.fontSize
                    onClicked: {
                        txtString = calc.getValue(txtString);
                    }
                }
            }
        }
    }
}

到这里就ok了,可以试着运行查看效果:
在这里插入图片描述
计算问题是解决了,接下来是关于这个界面的问题了,毫无疑问这个界面是巨丑的,后面这篇就会写如何改进这个界面,通过qml自带的组件来对这个界面的显示来进行优化和改进。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt 中可以使用 QtDialog 和 UI 来制作一个简单的计算器。 首先,我们可以创建一个 QtDialog 窗口来作为我们的计算器界面。通过继承 QDialog 类并实现需要的功能,我们可以自定义计算器的布局和交互。例如,我们可以在窗口中添加数字按钮、运算符按钮和显示结果的文本框。 接着,我们可以使用 Qt 的可视化设计工具来创建一个 UI 文件,用于定义计算器界面的布局和元素。在 UI 文件中,我们可以方便地拖拽和调整各个按钮和文本框的位置和大小。然后,我们可以将 UI 文件与 QtDialog 类关联起来,实现计算器界面和功能的绑定。 在 QtDialog 类的代码中,我们可以使用 Qt 的信号与槽机制来处理按钮的点击事件和计算逻辑。通过将按钮的点击信号与对应的槽函数连接起来,我们可以在用户点击按钮时执行相应的操作,比如将按钮的文本添加到计算表达式中,或者进行计算并显示结果。 最后,为了完成计算器的功能,我们还需要定义各个按钮的槽函数。这些槽函数可以使用 Qt 提供的 QRegularExpression 类来解析用户输入的表达式,并调用相应的计算函数进行计算。计算结果可以显示在文本框中,并根据需要进行格式化和处理。 通过以上步骤,我们可以使用 QtDialog 和 UI 来制作一个简单的计算器。这样做的好处是可以方便地在界面上进行布局和设计,同时可以利用 Qt 的信号与槽机制实现计算器的功能。此外,Qt 还提供了丰富的界面控件和功能模块,可以进一步扩展计算器的功能,使其更加实用和易用。 ### 回答2: 在Qt中,我们可以使用Qt Dialog 和 Qt UI设计来创建一个简单的计算器。 首先,我们需要创建一个新的Qt项目,并添加一个Qt Dialog部件。这个对话框将用于容纳我们的计算器界面。 接下来,我们需要在Qt Designer中设计计算器的用户界面。我们可以使用布局管理器来放置按钮、标签和文本框等控件。可以添加按钮来实现数字和操作符的输入,并添加一个结果文本框来显示计算结果。 在Qt代码中,我们首先需要使用Qt的信号和槽机制来连接按钮和计算函数。我们可以将按钮点击事件与槽函数进行连接,槽函数将根据按钮的文本执行相应的操作。 例如,当我们点击数字按钮时,应该将对应的数字追加到文本框中。当我们点击操作符按钮时,应该将对应的操作符存储起来。 接下来,我们需要实现一个计算函数来处理用户输入的表达式。我们可以使用eval()函数来动态计算表达式的值,并将结果显示在文本框中。 最后,我们需要将计算器界面显示在屏幕上。我们可以使用QDialog::exec()函数来显示对话框,并等待用户关闭计算器。 综上所述,通过使用Qt Dialog和Qt UI设计,我们可以创建一个简单的计算器。这个计算器可以处理用户的输入,并显示计算结果。同时,我们还可以根据需要进行扩展,添加更多的功能和操作。 ### 回答3: Qt一个广泛使用的C++开发框架,可以用于开发跨平台的应用程序。在Qt中,我们可以使用QtDialog和UI构建计算器应用程序。 首先,我们需要创建一个新的Qt项目。通过Qt Creator创建一个新的Qt Widgets应用程序项目。然后,我们可以在Qt Creator的主窗口中看到设计和代码视图。 在设计视图中,我们可以使用Qt的可视化设计器来创建计算器界面。可以添加按钮、文本框和标签等UI控件,并将它们排列成适当的布局。可以将这些UI控件命名为btn_0、btn_1、btn_2等等,以便在代码中引用。可以通过设置按钮的clicked信号来连接到相应的槽函数,以便在用户点击按钮时进行响应。 在代码视图中,我们可以使用Qt的信号和槽机制来处理UI控件的操作和交互。可以通过继承QDialog类来创建一个自定义对话框类,将其作为应用程序的主窗口。可以在自定义对话框类中定义计算器的逻辑和功能。例如,可以为每个数字按钮创建一个槽函数,以便在用户点击它们时将数字显示在文本框中。可以为运算符按钮创建槽函数,以便在用户点击它们时执行相应的计算操作。可以为等号按钮创建一个槽函数,以便在用户点击它时计算结果并显示在文本框中。 在槽函数中,可以使用Qt的QString类来操作和处理计算器的输入和输出。可以使用QString的toInt()、toDouble()等函数将文本转换为数字,并使用QString的arg()函数将结果转换为字符串。 最后,可以在主函数中实例化自定义对话框类,并调用show()函数将它显示出来。这样,当用户运行应用程序时,就会看到一个具有按钮和文本框的计算器界面。 总之,使用QtDialog和UI来制作计算器可以充分利用Qt的功能和特性,简化开发过程并创建出功能强大且美观的界面

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值