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

news2024/12/23 13:18:49

前面两篇对计算器界面的布局和显示以及实现功能做了相关优化,但是对输入显示那一块还没有具体的处理步骤,包括对输入表达式的合法性检查,显示框的多行历史显示等功能还需要添加,接下来将从这几个方面对这些功能进行添加。

1、对输入计算式表达内容进行判断

目前对表达式的内容输入是一个字符一个字符添加到字符串尾部的,所以判断输入表达式的合法性只需判断当前输入字符和前一个字符是否符合运算表达式规则即可。对一些不能放在第一个的字符进行单独判断,如果是第一个字符就输入的该字符就进行报错提示,具体对字符的判断放在c++代码里面去实现。
对输入字符判断的主要函数:

bool Calc::checkInput(QString str, QString ch)
{
    QStringList strList = {"+","-","*","/"};

    if(ch == "")
        return false;

    //当表达式为空,输入0,/, *,为非法
    if(str == "")
    {
        if((ch == "0") || (ch == "/") || (ch == "*") || (ch == "÷"))
            return false;
    }

    //如果输入的是运算符,判断前一个字符,如果是运算符则非法
    if((ch == "+") || (ch == "-") || (ch == "*") || (ch == "/") || (ch == "x") || (ch == "÷"))
    {
        if(str.length() == 0)
        {
            if((ch == "+") || (ch == "-"))
                return true;
            else
                return false;
        }

        int len = str.length();
        for(int i = 0; i < strList.size(); i++)
        {
            if(str.at(len - 1) == strList.at(i))
                return false;
        }
    }

    return true;
}

2、设置输入显示框显示输入的历史计算数据,每使用一次自动使用一行来显示

现在来使用显示数据的组件是TextArea,这是qt quick提供的一个多行文本编辑框,可以自动的支持滚动,只需要将TextArea放在ScrollView组件中就能支持自动滚动了,不用自己来实现滚动的效果,还可以设置背景显示,还可以在字符串中加入占位符来控制换行显示。控制行显示的方法就是在每得出一个值后后面加一个“\n"来控制换行,使TextArea的显示换到新行来显示,填充值就是在每按下按钮判断不是一个非法值后继续追加到字符串末尾就可以了。
TextArea支持滚动模板:
直接将TextArea组件放在ScrollView里面,当内蓉过多就能实现滚动效果。

ScrollView {
            id:view;
            anchors.fill: parent;

            TextArea {
                height:parent.height-20;
                width:parent.width;
                anchors.top:parent.top;
                anchors.topMargin: 10;
                anchors.left: parent.left;
                anchors.leftMargin: 10;
                text: endString;
                font.pixelSize: 25;
                wrapMode: Text.WrapAnywhere;
                clip:true;
            }
        }

3、对输入错误内容进行弹窗提示

这个功能主要的是利用qml 组件Dialog来实现的,非常简单,对组件进行调用修改其中的属性即可,具体是实现的步骤如下;

Dialog {
        id:dialog;
        title: "错误告警";
        standardButtons: Dialog.Ok;
        implicitHeight: 200;
        implicitWidth: 300;
        x:(parent.width-width)/2;
        y:20;

        contentItem: Item {
            Text {
                anchors.centerIn: parent;
                text: "输入的是一个错误的值!";
            }
        }
    }

这次主要是增加这三个小功能,具体的实现代码就不一一贴上来了,是根据前面的两篇文章基础上更改的,项目文件会上传到下载文件;
功能实现的效果图:
在这里插入图片描述
后续有时间会继续做一些新功能和旧功能的优化,也会移到嵌入式设备上进行调试,应该不会太久。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/390564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

概率论 1.3 古典概型与几何概型

1.3.1 排列与组合排列从n个不同元素任取r(r<n)个元素排成一列(考虑元素出现的先后次序)&#xff0c;称此为一个排列&#xff0c;此种排列的总数为n(n-1)....(n-r1)n!/(n-r)&#xff01;&#xff0c;若rn,则称为全排列&#xff0c;2.重复排列从n个不同元素中每次取出一个,放回…

GPIO输入和输出以及八种工作模式

一.GPIO的简介 GPIO &#xff08;general purpose input output&#xff09;是通用输入输出端口的简称&#xff0c;简单来说就是软件可控制的引脚&#xff0c;STM32芯片的GPIO引脚与外部传感器连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。 1.引脚全是GP…

[2.1.1]进程管理——进程的概念、组成、特征

文章目录第二章 进程管理进程的概念、组成、特征&#xff08;一&#xff09;进程的概念&#xff08;二&#xff09;进程的组成——PCB&#xff08;三&#xff09;进程的组成——程序段、数据段补充&#xff1a;程序是如何运行的&#xff1f;&#xff08;四&#xff09;进程的特…

vue3 插槽使用详解

目录1 前言2 插槽的使用2.1 基本使用2.2 具名插槽2.3 动态插槽名2.4 插槽传值3 总结1 前言 Vue 实现了一套内容分发的 API&#xff0c;将 <slot> 元素作为承载分发内容的出口&#xff0c;使用插槽使得vue组件的设计更加灵活。 在vue版本更迭中&#xff0c;尽管插槽的使…

常用的设计模式之一(创建型模式)

设计模式可分为三大类&#xff1a; 创建型模式 (Creational Patterns)结构性模式 (Structural Patterns)行为型模式 (Behavioral Patterns) 模式描述包括创建型模式工厂模式&#xff08;Factory Pattern&#xff09; 抽象工厂模式&#xff08;Abstract Factory Pattern&#…

并发编程——可见性与有序性

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;耶瞳空间 JMM即Java Memory Model&#xff0c;它定义了主存、工作内存抽象概念&#xff0c;底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。JMM体现在以下几个方面&#xff1a; 原子性&…

Web API

DOM API 1、选中页面元素 let elem document.querySelector(CSS选择器); console.log(elem); console.dir(elem); 2、事件 鼠标点击事件 onclick 鼠标移动事件 onmousemove 等等 事件源 .box&#xff0c;事件类型 onlick&#xff0c;事件处理方式 alert(hello) let d…

[Mybatis1]介绍与快速入门

文章目录 Mybatis概述 持久层 框架 Mybatis与JDBC对比 JDBC代码的缺陷 Mybatis简化JDBC Mybatis快速入门案例 整体案例项目结构 1.创建user表&#xff0c;添加数据 2.创建Maven项目&#xff0c;导入坐标 3.编写Mybatis核心配置文件 4.编写数据库返回对象的实体类 5. 编写S…

QML Button详解

1.Button简介 Button表示用户可以按下或单击的按钮控件。按钮通常用于执行一个动作&#xff0c;或回答一个问题。典型的按钮有确定、应用、取消、关闭、是、否和帮助。 Button继承自AbstractButton&#xff0c;提供了以下几种信号。 void canceled() //当按…

Python笔记 -- 列表

文章目录1、列表简介2、修改、添加、删除元素2.1、添加2.2、删除3、排序、倒序4、遍历列表5、创建数值列表6、列表切片7、列表复制8、元组1、列表简介 在Python中用方括号[]表示列表&#xff0c;用逗号隔开表示其元素 通过索引访问列表 names [aa,bb,cc,dd]print(names[0]) …

游戏项目中的程序化生成(PCG):算法之外的问题与问题

本篇讨论的是什么 从概念上讲&#xff0c;PCG&#xff08;程序化生成&#xff09;的含义很广&#xff1a;任何通过规则计算得到的内容&#xff0c;都可算作是PCG。但在很多游戏项目的资料&#xff0c;包括本篇&#xff0c;讨论PCG时特指是&#xff1a;用一些算法/工具(特别是H…

C语言-基础了解-13-C enum枚举

C enum枚举 一、C枚举 枚举是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量。&#xff0c;它可以让数据更简洁&#xff0c;更易读。 枚举类型通常用于为程序中的一组相关的常量取名字&#xff0c;以便于程序的可读性和维护性。 定义一个枚举类型&a…

3.2 LED闪烁流水灯蜂鸣器

LED闪烁1.1 电路连接示意图LED采用低电平点亮的方式&#xff0c;利用ST-Link的3.3V进行供电。1.2程序设计1.21知识储备GPIO配置步骤步骤&#xff1a;1. 第⼀步&#xff0c;使⽤RCC开启GPIO的时钟2. 第⼆步&#xff0c;使⽤GPIO_Init()函数初始化GPIO3. 第三步&#xff0c;使⽤输…

JavaWeb--会话技术

会话技术1 会话跟踪技术的概述2 Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3 Session3.1 Session的基本使用3.2 Session的原理分析3.3 Session的使用细节3.3.1 Session钝化与活化3.3.2 Session销毁目标 理…

java坦克大战(1.0)

坦克大战 后面开始学习怎么使用java制造一个坦克大战游戏 但是不是直接开始做&#xff0c;而是随着这个游戏程序的制造&#xff0c;一边学习新知识融入到游戏中。包括多线程&#xff0c;反射&#xff0c;IO流… Java坐标体系 在几乎所有的坐标中都有一个x轴和y轴&#xff0c…

大数据项目实战之数据仓库:用户行为采集平台——第1章 数据仓库概念

第1章 数据仓库概念 数据仓库&#xff08;Data Warehouse&#xff09;&#xff0c;是为企业制定决策&#xff0c;提供数据支持的。可以帮助企业改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括&#xff1a;业务数据、用户行为数据和爬虫数据等 业务数据&#xf…

Java - 对象的比较

一、问题提出 前面讲了优先级队列&#xff0c;优先级队列在插入元素时有个要求&#xff1a;插入的元素不能是null或者元素之间必须要能够进行比较&#xff0c;为了简单起见&#xff0c;我们只是插入了Integer类型&#xff0c; 那优先级队列中能否插入自定义类型对象呢&#xf…

深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架

文章目录一、动手实现一个动态代理框架1、初识javassist2、使用javassist实现一个动态代理框架二、JDK动态代理1、编码实现2、基本原理&#xff08;1&#xff09;getProxyClass0方法&#xff08;2&#xff09;总结写在后面一、动手实现一个动态代理框架 1、初识javassist Jav…

Dijkstra算法的入门与应用

目录 一、前言 二、Dijkstra算法 1、Dijkstra 算法简介 2、算法思想&#xff1a;多米诺骨牌 3、算法实现 4、例子 三、例题 1、蓝桥王国&#xff08;lanqiaoOJ题号1122&#xff09; 一、前言 本文主要讲了Dijkstra算法的概念、实现与一道模板例题。 二、Dijkstra算法…

RSTP基础要点(上)

RSTP基础RSTP引入背景STP所存在的问题RSTP对于STP的改进端口角色重新划分端口状态重新划分快速收敛机制&#xff1a;PA机制端口快速切换边缘端口的引入RSTP引入背景 STP协议虽然能够解决环路问题&#xff0c;但是由于网络拓扑收敛较慢&#xff0c;影响了用户通信质量&#xff…