計算プロセスにグラフィカル インターフェイスを必要とするアプリケーションを構築しています。計算は基本的に、QScriptEngine (Javascript) で評価されるようにユーザーが作成した式です。
問題は、問題を小さなステップに分解するのに苦労していることです。一般的な目的は次のとおりです。
- 数式で使用される値は、項目のプロパティに報告されます。アイテムはすでに作成されており、QTableWidgetに入力するプロパティのリストがあります。
- テーブルから QTextEdit にドラッグ/ドロップすることで、ユーザーが式をより直感的に読めるように、リッチフォーマットの文字列を作成しています。基本的に、テーブルの各項目には特定の色があるため、QTextEdit で項目がドロップされると、同じ色の書式が設定され、プロパティの名前が表示されます。何かのようなもの:
background-color
<span style='background-color:red;'> propertyName </span>
ドラッグ アンド ドロップ インターフェイスと書式設定はコード化されており、期待どおりに機能します。しかし今、私はいくつかの問題を抱えています:
- 一部のアイテムには同じ名前のプロパティがあります。同じ名前を持つ 2 つの異なるプロパティ (異なるアイテムから) を使用して数式を作成すると、あいまいさなしにプロパティの値を逆方向に追跡することはできません。と
evaluate()
。
私はこれを回避する方法について頭を悩ませていました。関係QMultiMap
を保持するためにを作成しitem: [property, value]
、評価される文字列を置き換えることを考えました。しかし、繰り返しますが、プロパティがどのアイテムから来たのかを確認する必要がありますが、どうすればそれができるのかわかりません。
私は Qt/C++ の初心者であり、私のコードのほとんどにいくつかの大きな欠陥のあるプラクティスがあることを知っています。それは、適切な構造を構築するというよりも、必要な目的を達成するためにハッキングする方法で行われているため、すべての新しい問題は毎回より複雑な解決策を得ます。
それでも、この問題にどのように取り組むべきでしょうか? この時点で、まだコードを投稿しないほうがよいと思います。なぜなら、見るには長すぎる (そしておそらく苦痛を伴う) からです。問題のコンテキストをよりよく理解するために特定の部分が必要な場合は、お知らせください。ここに投稿します。
また、これについて考え始めたとき、SO で他の質問がありました - コンテキストを確認するのに役立つかもしれません: here。
アップデート:
@Riache のコメントへの返信:
次のシナリオを想像してください。
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
これが評価された文字列になります。それでも、ユーザーが文字列を編集する際の問題は依然として存在します。ユーザーがドラッグ/ドロップ文字列を変更した場合、評価文字列を再度更新する必要があり、データの元をもう一度確認する必要があります。他のアイデアはありますか?