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

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

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

Пример

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

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

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


person nilshi    schedule 05.08.2011    source источник
comment
Не могли бы вы дать некоторую информацию о размерах, о которых мы здесь говорим? 5 строк по 15 событий? 100 строк с 5000 событий?   -  person Exa    schedule 05.08.2011
comment
@Exa Да, конечно. Я не могу предсказать это, так как это выбор пользователя, но вот здравый смысл: поскольку нижние границы не будут проблемой (с точки зрения производительности), в любом случае общая верхняя граница будет около 150 строк с несколькими от сотен до 5 тысяч событий. Значения выше этого не следует предотвращать, но это редко, и пользователи в любом случае будут ожидать проблем с производительностью с этого момента.   -  person nilshi    schedule 05.08.2011


Ответы (1)


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

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

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

person Scott Minster    schedule 05.08.2011