Qt - 创建复杂的"calculator"

Qt - creating a complex "calculator"

本文关键字:calculator 复杂 创建 Qt      更新时间:2023-10-16

我正在构建一个应用程序,该应用程序需要用于计算过程的图形界面。计算基本上是由用户编写的公式,用QScriptEngine(即Javascript)进行评估。

问题是我很难把这个问题分解成更小的步骤。总体目标如下:

  • 要在公式中使用的报告给properties。这些项已经创建,并且有一个属性列表,我用它来填充QTableWidget
  • 通过从表拖放到QTextEdit,我创建了一个具有丰富格式的字符串,以帮助用户更直观地阅读公式。基本上,表上的每个项目都有特定的颜色,因此在QTextEdit中,当一个项目被删除时,它会获得相同颜色的background-color格式,并显示属性的名称;类似于:<span style='background-color:red;'> propertyName </span>

拖放界面以及格式化都按照预期进行了编码和工作。但现在我有几个问题:

  • 有些项目具有相同名称的属性。如果我创建的公式有两个不同的属性(来自不同的项),它们具有相同的名称,我就无法无歧义地向后跟踪属性的——我想到的是字符串比较/string用其值替换属性的名称,然后用evaluate()计算

我一直在思考如何绕过这一点,我想创建一个QMultiMap来保持item: [property, value]关系,然后替换将要评估的字符串。但是,我需要再次检查表格中的财产来自哪个项目,我不知道该怎么做。

我是Qt/C++的新手,我知道我的大多数代码都有一些大的错误做法,而且它更多地是以黑客的方式来实现我所需要的目标,而不是构建一个好的结构,所以每个新问题每次都会得到更复杂的解决方案。

即便如此,你建议我如何解决这个问题此时,我认为最好不要发布我的代码,因为它太长了(可能很痛苦)。如果有人需要特定的部分来更好地理解问题的上下文,请告诉我,我会在这里发布。

此外,当我开始思考这个问题时,我在SO中还有其他问题——可能对检查上下文有用:这里。

更新:

回复@Riateche的评论:

想象一下这个场景:

Item A : [property1, value1]
         [property2, value2]
Item B : [property1, value3]
         [property2, value4]

现在,假设用户想要执行ItemA.property1 * ItemB.property1:

  • 我想让他看到property1*property1,但请注意,每个的背景颜色应该不同
  • 我可以在QTextEdit中放置类似的内容:<span style='background-color:red;'> property1 </span> * <span style='background-color:blue;'> property1 </span>
  • 我实际想要评估(计算)的是:value1*value3-其中这些表示类型

更新2

经过思考,虽然@Riateche的方法看起来很简单,但我没能找到改变标签属性的方法(至少在富文本中,也许QWebkit有一个,但这不是我需要的)。所以我在想,如果构建另一个字符串(将被评估),同时用户通过拖放来构建一个字符串。例如,让我们想象一下用户拖放一些东西,比如:

property1*property1

同时,我会构建包含的其他字符串

value1*value3

这将是被求值的字符串。即便如此,用户编辑字符串的问题仍然存在-如果用户更改拖放字符串,我需要再次更新评估字符串-需要我再次检查数据的来源。还有其他想法吗?

您应该将公式评估的所有重要信息放到文本编辑中。您可以使其对用户不可见。例如,您可以将以下内容放到文本编辑中:

<span style='background-color:red;'><a name='Item A,property1'></a>property1</span>

Item A,property1文本对用户来说是不可见的,但textEdit->toHtml()结果将包含它。