Я пытаюсь вставить несколько строк данных в мой TextView (около 5-10 строк), используя следующий метод:
Glib::RefPtr<Gtk::TextBuffer> buffer = txtView.get_buffer();
buffer->set_text("");
Gtk::TextBuffer::iterator iter;
iter = buffer->get_iter_at_offset(0);
iter = buffer->insert(iter, myString);
Где «myString» — это хорошо отформатированная строка (с заданными конечными строками), которая передается из другой функции. Пример «myString» будет выглядеть следующим образом:
- Это первая линия
Это вторая линия
Blablabla
Это третья линия
Blablabla
Содержимое строки отличается при каждом вызове функции. Моя проблема здесь в том, что я пытаюсь применить разные буферы к разным строкам строки.
Например, я хочу применить синий цвет фона к строке 2, зеленый к строке 3 и красный к строке 5. Как это можно сделать, поскольку вместо этого я передаю свои строки данных в функцию как целую строку передать его в построчно. (Я не мог передать их все построчно, так как моя программа многопоточная, и это было бы не очень хорошо).
Я сделал что-то вроде этого, но это только изменить весь буфер TextView, а не конкретную строку.
buffer->property_background() = "red";
txtView->set_buffer(buffer);
Как сказал andlabs, вам нужно использовать Gtk :: TextBuffer :: Tag. Пожалуйста, найдите несколько фрагментов для начала. Ссылка здесь https://developer.gnome.org/gtkmm-tutorial/stable/sec-textview-buffer.html.sl
Создайте необходимый TagTable и Tag, назначьте свойства для Tag и добавьте Tag в TagTable.
m_reftagtable = Gtk::TextBuffer::TagTable::create();
reftagmatch = Gtk::TextBuffer::Tag::create();
reftagmatch->property_background() = "orange";
m_reftagtable->add(reftagmatch);
Создайте Textbuffer с TagTable
m_textbuffer = Gtk::TextBuffer::create(m_reftagtable);
m_textview->set_buffer(m_textbuffer);
Давайте предположим, что у вас есть какое-то условие, и в зависимости от логического состояния открытого текста вы можете добавить обычный текст или текст с оранжевым фоном.
iterend = m_textbuffer->get_iter_at_offset(m_textbuffer->get_char_count());
if (plaintextcondition){
m_textbuffer->insert(iterend, "Plain text");
} else {
m_textbuffer->insert_with_tag(iterend, "Orange Text", refTagMatch);
}
Конечно, это только подсказка. Пожалуйста, обратитесь к ссылке для получения дополнительной информации.
Других решений пока нет …