Qt - 创建一个复杂的“计算器”

时间:2013-07-08 10:18:46

标签: c++ qt evaluate

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

问题是我无法将问题分解为更小的步骤。总体目标如下:

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

拖放界面以及格式化编码并按预期工作。但现在我有一些问题:

  • 某些项目具有相同名称的属性。如果我使用具有相同名称的两个不同属性(来自不同项目)创建公式,我无法向后追踪属性的而没有歧义 - 我在考虑字符串比较/字符串替换属性的名称及其值,然后使用evaluate()计算。

我一直在试图解决这个问题,我想创建一个QMultiMap以保持item: [property, value]关系,然后替换将要评估的字符串。但同样,我需要检查表单属性来自哪个项目,我不知道如何做到这一点。

我是Qt / C ++的新手,我知道我的大部分代码都有一些大错误的做法,并且通过 hacking 的方式完成了我所需的目标,不仅仅是建立一个良好的结构 - 每一个新问题每次都会得到一个更复杂的解决方案。

即便如此,您如何建议我应该解决这个问题?此时我认为最好不要发布我的代码,因为它太长(并且可能很痛苦)看着。如果有人需要特定部分来更好地理解问题的背景,请告诉我,我会在这里发布。

此外,当我开始考虑这个问题时,我还有其他问题 - 检查上下文可能有用:here

更新

回复@ 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 - 其中这些代表 double 类型。

更新2

在考虑了一点之后,虽然@ Riateche的方法看起来很简单,但是我无法找到改变标签属性的方法(至少在富文本中,也许有一个用QWebkit,但那不是什么我需要)。所以我在考虑是否构建另一个字符串(将被评估),同时用户使用拖放来构建字符串。例如,让我们假设用户拖拽和删除类似:

property1 * property1

同时我会构建包含

的其他字符串

value1 * value3

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

1 个答案:

答案 0 :(得分:2)

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

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

Item A,property1文字对用户不可见,但textEdit->toHtml()结果将包含该文字。