gtk — C ++ GTKmm — вставка текста в TextView с несколькими буферами и изменением текста

Я пытаюсь вставить несколько строк данных в мой 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» будет выглядеть следующим образом:

  1. Это первая линия
  2. Это вторая линия

    Blablabla

  3. Это третья линия

    Blablabla

Содержимое строки отличается при каждом вызове функции. Моя проблема здесь в том, что я пытаюсь применить разные буферы к разным строкам строки.

Например, я хочу применить синий цвет фона к строке 2, зеленый к строке 3 и красный к строке 5. Как это можно сделать, поскольку вместо этого я передаю свои строки данных в функцию как целую строку передать его в построчно. (Я не мог передать их все построчно, так как моя программа многопоточная, и это было бы не очень хорошо).

Я сделал что-то вроде этого, но это только изменить весь буфер TextView, а не конкретную строку.

buffer->property_background() = "red";
txtView->set_buffer(buffer);

1

Решение

Как сказал 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);
}

Конечно, это только подсказка. Пожалуйста, обратитесь к ссылке для получения дополнительной информации.

1

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

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

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