GTK TextView — создание статического формата отображения

Я пытаюсь смоделировать часть оборудования, и это оборудование имеет статический ленточный дисплей.

для этого я хотел бы использовать TextView. Мой дисплей имеет 10 строк с 25 столбцами. Поэтому я решил, что TextView должен быть достаточно простым.

в основном, я хотел бы иметь возможность сказать "вставить/заменить строку S в строке X, начиная со столбца Y". мне может потребоваться обновить только определенную строку или даже один столбец в строке.

Однако мне не удалось заставить это работать. лучшее, что я смог сделать, это заполнить TextView 10 строками по 25 пробелов при его создании, а затем использовать get_iter_at_line_offset, чтобы получить итератор строки, а затем вставить новый текст в эту строку.

но это начнет добавлять текст к строке, а не заменять существующий.

Мне нужно управление как строкой, так и столбцом (т.е. нужно иметь возможность устанавливать текст в определенной координате (X, Y)).

Я предполагаю, что это как-то возможно с помощью меток.

Может ли кто-нибудь дать мне быстрый пример того, как я могу это сделать? К сожалению, не так много документации по такого рода вещам.


person jasonmclose    schedule 07.05.2012    source источник
comment
Я не знаю, что такое статическое отображение ленты, но, основываясь на вашем описании, я думаю, что подход на основе Gtk::DrawingArea будет относительно простым и позволит контролировать внешний вид результата.   -  person ergosys    schedule 08.05.2012


Ответы (2)


Вам нужно будет получить итератор в определенной строке, строке X, а затем использовать метод forward_chars() итератора для перемещения вперед на Y символов. Затем удалите количество символов, которые вы заменяете, и, наконец, вставьте текст, который вы хотите вставить. Вы можете сделать все это с итераторами, я думаю - итераторы становятся недействительными при изменении буфера, но когда вы удаляете текст, один из ваших итераторов перепроверяется, чтобы указать на место, где был текст.

person ptomato    schedule 08.05.2012
comment
Было бы совершенно ужасно просто поддерживать мой графический интерфейс в памяти, а затем использовать set_text для базовой очистки и обновления всего буфера, когда я захочу его изменить? в основном выполняю все мои манипуляции с длинным массивом символов (с новыми строками в каждом 25-м индексе), а затем проталкиваю это через set_text? - person jasonmclose; 08.05.2012
comment
Зависит от того, как часто вам нужно обновлять дисплей. Возможно, лучше просто попробовать, а потом оптимизировать, если будет слишком медленно? Память не будет проблемой, большинство компьютеров в наши дни имеют не менее 250 байт памяти. - person ptomato; 08.05.2012
comment
обновляется раз в секунду. я думаю, что я пойду по этому пути. Мне нравится идея использования cairo, как опубликовано unwind, но у меня есть крайний срок для бета-тестирования, поэтому я сделаю это сейчас и оптимизирую позже, как только у меня будет время для фазы 2. - person jasonmclose; 08.05.2012

Если вы ориентируетесь на GTK+ 3.x, вам действительно стоит подумать об использовании Cairo. Поскольку вам на самом деле не нужен текстовый буфер, использование GtkTextView кажется излишним и немного неправильным.

Посмотрите очень простое введение о том, как рисовать с Каир в GTK+. Затем посмотрите на API Cairo для рендеринга текста, этого должно быть достаточно для начала.

person unwind    schedule 08.05.2012
comment
Привет. Почему только GTK+ 3.x. а не с GTK+ 2? Я знаю, что здесь и там есть довольно много изменений, но есть ли какие-либо улучшения производительности? Потому что, по моему опыту, Каир ужасен для чего-то подобного. - person Ivarpoiss; 12.06.2012