Как создать графический интерфейс с несколькими строками глифов / текста параллельно, где глифы имеют координаты x и y - PullRequest
1 голос
/ 05 августа 2011

В настоящее время я создаю приложение для редактирования параллельных списков событий, которые происходят на таймфрейме. В модели / бэкэнде есть список списков, в котором подсписок имеет все элементы в порядке.

Каждое событие должно быть представлено строкой / глифом (от шрифта ttf), и каждая из текстовых строк должна редактироваться как обычная строка текста с несколькими исключениями, как они отображаются. Посмотрите на эту картинку:

Example

В основном каждая строка представляет собой строку текста. Каждое событие представляет собой один символ / глиф. Так что это текстовый редактор ?! Не совсем

  1. Нет разрывов строк
  2. Несколько линий параллельно
  3. Каждый глиф имеет отдельный пробел после него (направление X)
  4. Каждый глиф может быть сдвинут «вверх» и «вниз» индивидуально (направление Y) (возможно, самый важный пункт)
  5. Если вы удаляете глиф, все элементы справа от него идут на шаг «влево», чтобы закрыть пробел (как в обычном текстовом редакторе).
  6. Если вы вставите глиф, все элементы справа от него сделайте шаг «вправо», чтобы создать пробел для вставки.

Большинство из этих точек покрыты QGraphicsLinearLayout, но, возможно, это неправильный виджет / макет для этого подхода. Есть ли у вас какие-либо советы?

1 Ответ

1 голос
/ 05 августа 2011

Я бы предложил попробовать установить QGraphicsScene с вашими событиями как QGraphicText объекты (или, возможно, класс, производный от QGraphicText).Пусть каждый будет позиционироваться независимо, но пусть они знают о «следующем» событии в своей строке, например, о связанном списке.Затем, когда один из них вставлен или удален, вы можете быстро выполнить эту операцию и (к сожалению, медленнее) обновить позиции других событий в строке.Это обновление может быть не слишком большим кодом, если оно просто устанавливает положение равным X пикселям справа от предыдущего элемента, но оно должно будет обновлять каждое событие в строке после изменения.

Вы можетевозможно, сделайте что-нибудь, где событие справа является дочерним по отношению к текущему событию, и отодвиньте обновления позиции в Qt.Я не знаю, будет ли это более эффективным, и я не знаю, насколько глубокими могут быть дочерние деревья.

Обновление позиции Y события (требование 4) должно быть простым: просто измениего позиция Y.

...