1

我正在构建一个需要图形界面进行计算过程的应用程序。计算基本上是用户编写的公式,用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

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

4

1 回答 1

2

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

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

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

于 2013-07-08T12:17:11.510 回答