我正在构建一个需要图形界面进行计算过程的应用程序。计算基本上是用户编写的公式,用QScriptEngine进行评估- 即 Javascript。
问题是我无法将问题分解为更小的步骤。总体目标如下:
- 要在公式中使用的值报告项目的属性。这些项目已经创建并具有我用来填充QTableWidget的属性列表。
- 通过从表格拖放到QTextEdit,我正在创建一个格式丰富的字符串,以帮助用户更直观地阅读公式。基本上,表格上的每个项目都有一定的颜色,所以在QTextEdit中,当一个项目被放下时,它会得到一个
background-color
相同颜色的格式,并显示属性的名称;就像是:<span style='background-color:red;'> propertyName </span>
拖放界面以及格式已编码并按预期工作。但是现在我有几个问题:
- 某些项目具有同名的属性。如果我创建具有相同名称的两个不同属性(来自不同项目)的公式,我无法在没有歧义的情况下向后跟踪属性的值- 我正在考虑字符串比较/字符串用它的值替换属性的名称然后计算与
evaluate()
.
我一直在思考如何解决这个问题,我想创建一个QMultiMap
来保存item: [property, value]
关系,然后替换将被评估的字符串。但同样,我需要检查该属性来自哪个项目,我不知道该怎么做。
我是 Qt/C++ 的新手,我知道我的大部分代码都有一些很大的错误实践,而且它更多地是在通过我需要的目标来破解我的方式,而不是构建一个好的结构 - 所以每一个新的问题每次都会得到更复杂的解决方案。
即便如此,你建议我应该如何解决这个问题?到这个时候,我认为最好还是不要发布我的代码,因为它太长(而且可能很痛苦)无法查看。如果有人需要特定部分来更好地理解问题的背景,请告诉我,我会在这里发布。
另外,当我开始考虑这个问题时,我在 SO 中还有其他问题 - 检查上下文可能很有用: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
- 其中这些代表双重类型。
更新 2
在考虑了一点之后,虽然@Riateche 的方法看起来很简单,但我无法找到改变标签属性的方法(至少在富文本中,也许有一个带有 QWebkit 的,但这不是我需要的) . 所以我在考虑是否构建另一个字符串(将被评估),同时用户通过拖放构建一个字符串。例如,让我们假设用户拖放如下内容:
property1
*property1
同时我会构建其他包含
value1
*value3
这将是评估的字符串。即便如此,用户编辑字符串的问题仍然存在——如果用户更改拖放字符串,我需要再次更新评估字符串——要求我再次检查数据的来源。还有其他想法吗?