C++ GTKmm - 如何获取我的 TextView (TextBuffer) 的内容

Posted

技术标签:

【中文标题】C++ GTKmm - 如何获取我的 TextView (TextBuffer) 的内容【英文标题】:C++ GTKmm - How do I get the content of my TextView (TextBuffer) 【发布时间】:2016-05-07 08:59:59 【问题描述】:

我正在 Linux 上学习 GTKmm (C++)。

我想通过按下按钮来获取 TextView 的内容。

代码std::cout << m_textBuffer->get_text();没有向控制台输出任何东西,我在官网上也找不到足够的解释。

似乎我需要使用迭代器,但尝试在函数get_text() 中使用m_textBuffer->start() 会告诉我start() 不是TextBuffer 的函数,也不是等效的end()。

控制台输出一些可能相关的警告:

Gtk-CRITICAL **: gtk_text_buffer_get_iter_at_mark: 断言 'GTK_IS_TEXT_MARK (mark)' 失败 Gtk-CRITICAL **: gtk_text_layout_get_line_yrange: 断言 '_gtk_text_iter_get_btree (iter) == _gtk_text_buffer_get_btree (layout->buffer)' 失败

在 GUI 构造函数中,我有这个:

m_txtQuestion.set_buffer(m_textBuffer);

m_textBuffer = Gtk::TextBuffer::create();
m_textBuffer->set_text("")

【问题讨论】:

【参考方案1】:

(对于 gtkmm-2.4 和 gtkmm-3.0): 不要尝试设置缓冲区,只需使用 TextView 中的缓冲区:

m_txtQuestion.get_buffer()->set_text("My text.");

然后获取文本使用:

m_txtQuestion.get_buffer()->get_text();

【讨论】:

谢谢,这行得通。为了澄清,m_txtQuestion 是 TextView,m_textBuffer 是 TextBuffer。所以,我不需要创建一个 TextBuffer,因为 TextView 已经提供了一个(应该更仔细地阅读文档)。我现在可以将它输出回控制台,但是它只会在程序关闭时显示文本(带有 std::cout << m_textBuffer->get_text() ),但是如果我执行 std::cout << m_textBuffer->get_text() << "\n" (或者如果我将 \n 替换为 std::endl )。如果你能告诉我为什么那会很棒,但到目前为止这只是好奇。再次感谢。 对不起,我没有注意哪个对象是 TextView。我编辑了我的答案以使用 TextView。我不确定为什么在程序关闭之前它不打印(您可能需要处理一个事件或信号,如 on_click,并将打印放在信号处理程序中)。 注意:std::endl 刷新输出流(除了插入换行符),这可能是您在使用它时看到立即控制台显示的原因。至于“\n”,我不确定为什么会立即显示,除非库实现将其视为 std::endl。

以上是关于C++ GTKmm - 如何获取我的 TextView (TextBuffer) 的内容的主要内容,如果未能解决你的问题,请参考以下文章

C++ vector 和 Gtkmm 能完美地协同工作吗?从 gtkmm on_click 方法获取向量<string> 的值时出现分段错误

使用 Glade 和 gtkmm 对 GTK+ 对象进行内存管理

在 Eclipse 中为 C++ 设置 GTKmm

如何在 Gtkmm3 中使用 CssStyleProvider

C++ GTKMM,在文本缓冲区中得到一个奇怪的输出

C++ gtkmm:FileChooserDialog 不适用于任何驱动器