在gtk3 Textview

时间:2015-06-06 22:27:26

标签: c++ c gtk gtk3 gdk

我有一个结构,我填充更新我的textview小部件(注意我混合C和C ++代码,我的编译器是g ++)

struct wdata
{ 
// some other variables;
// assume all the widget are initiated properly
   struct *GUI { all the widgets...};
   const char* psText , *csText;   
}

在一个线程(与gtk_main线程不同)中,收到某些消息后...状态在texview中报告,并且因为它在不同的线程中运行,我使用gdk_threads_add_idle()

wd->csText = convChar(" Valid message : Ok... \n");
gdk_threads_add_idle(disptext_CS,(void*)wd);

其中包含方法convChar()disptext_CS

const gchar* convChar(string sc) 
{
return sc.c_str();
}

gboolean disptext_RFCS(void* wdata)
{
   WinData* wd = (WinData*)wdata;

   wd->GUI->mark = gtk_text_buffer_get_insert(wd->GUI->buffview);
   gtk_text_buffer_get_end_iter(wd->GUI->buffview, &wd->GUI->iter);
   gtk_text_buffer_move_mark(wd->GUI->buffview, wd->GUI->mark,
         &wd->GUI->iter);
   gtk_text_buffer_insert_at_cursor(wd->GUI->buffview, wd->csText, -1);
   gtk_text_view_scroll_to_mark(wd->GUI->txtview, wd->GUI->mark, 0.0, TRUE,
         1.0, 0.0);

return G_SOURCE_REMOVE;
}

GtkTextview中的输出:

textview显示带有@的乱码字符串,我认为它与没有空字符串的字符串或大小错误有关,我从字符串到char的转换是可疑的。

 Valid messa@ Valid messa@ Valid message : O@ Valid message : O@

shell中的输出:

Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed

但我期待这样的事情:

Valid message : Ok...
Valid message : Ok...
Valid message : Ok...
Valid message : Ok...

1 个答案:

答案 0 :(得分:0)

const char* psText , csText;

不会创建两个指针。它与

相同
const char* psText;
const char  csText;   

编译器应该警告这个错误,如果没有完全阻止它,通过告诉你csText的赋值转换指向没有强制转换的整数的指针。

要解决此问题,您需要在两个名称前加*

const char *psText, *csText;

此外,您的convChar()方法不安全:一旦sc参数超出范围,c_str()指针将无效。您需要存储它的副本。您可以使用g_strdup()轻松制作一个;完成后请务必使用g_free()将其释放。

如果您传递给convChar()的字符串始终为"string literal",则根本不需要该功能;字符串文字的类型已经是const char *