C ++ GTKmm - 使用多个缓冲区和更改文本将文本插入TextView

时间:2016-12-11 10:59:06

标签: c++ gtk gtk3 gtkmm gtkmm3

我正在尝试使用以下方法将多行数据插入到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. 这是Line One
  2.   
  3. 这是第二行

         

    Blablabla

  4.   
  5. 这是第三行

         

    Blablabla

  6.   

每个函数调用的字符串内容都不同。我的问题是我试图将不同的缓冲区应用于字符串的不同行。

例如,我想将蓝色的背景颜色应用于第2行,将绿色应用于第3行,将红色应用于第5行。如果我将数据行传递到函数中,那么怎么办?整个字符串而不是逐行传递它。 (我无法逐行传递所有这些,因为我的程序是多线程的,这不会很好)。

我做过类似的事情,但这只会改变TextView的整个缓冲区,而不是特定的行。

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

1 个答案:

答案 0 :(得分: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);

使用TagTable创建Textbuffer

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);
}

当然这只是一个提示。有关更多信息,请参阅参考资料。