Qt — создание сложного «калькулятора»

Я строю приложение, которое требует графический интерфейс для процесса расчета.
Расчет в основном представляет собой формулу, написанную пользователем для оценки QScriptEngine — то есть, Javascript.

Дело в том, что мне трудно разбить проблему на более мелкие этапы. Общие цели заключаются в следующем:

  • ценности которые должны быть использованы в формула сообщить в свойства из Предметы. Элементы уже созданы и имеют список свойств, которыми я заполняю QTableWidget.
  • Перетаскивая из таблицы в QTextEdit, Я создаю строка с некоторыми форматирования, чтобы помочь пользователям читать формула более интуитивно По сути, каждый элемент таблицы имеет определенный цвет, поэтому в QTextEdit, когда элемент отбрасывается, он получает background-color форматирование с тем же цветом, и отображает имя свойства; что-то вроде: <span style='background-color:red;'> propertyName </span>

Интерфейс перетаскивания, а также форматирование закодированы и работают как положено. Но сейчас у меня есть несколько проблем:

  • некоторые элементы имеют свойства с одинаковыми именами. Если я создаю формулу с двумя разными свойствами (из разных элементов), которые имеют одинаковые имена, я не могу отслеживать свойства значение задом наперед без неоднозначности — я думал о сравнении строк / замене имени свойства на его значение и вычислении с 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

И это будет оцененная строка. Тем не менее, проблема с пользователем редактирование строка все еще будет там — если пользователь изменяет строку перетаскивания, мне нужно Обновить снова строка оценки, требующая от меня еще раз проверить происхождение данных. Есть другие идеи?

1

Решение

Вы должны поместить всю информацию, важную для оценки формулы, в текстовый редактор. Вы можете сделать его невидимым для пользователя. Например, вы можете поместить следующее в текстовое редактирование:

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

Item A,property1 текст будет невидим для пользователя, но textEdit->toHtml() результат будет содержать его.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]