c - 无效的 UTF-8 字符串

标签 c gtk

我试图将窗口标题与窗口内的标签交换 按键。

下面是我的代码:

#include<gtk/gtk.h>
static gboolean key_press_event(GtkWidget*,GdkEvent*,gpointer);

   int main(int argv, char* argc[])
    {
      GtkWidget *window,*label;
      gtk_init(&argv,&argc);
      window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title(GTK_WINDOW(window),"Sajith");
      gtk_widget_set_size_request(window,300,100);
      label=gtk_label_new("Sam");
      gtk_label_set_selectable(GTK_LABEL(label),TRUE);
      gtk_container_add(GTK_CONTAINER(window),label);
      g_signal_connect(G_OBJECT(window),"key_press_event",
                       G_CALLBACK(key_press_event),label);
      gtk_widget_show_all(window);
      gtk_main();
    }
    static gboolean key_press_event(GtkWidget* window, GdkEvent* event, gpointer label)
    {
      GtkWidget* newlabel;
      newlabel=GTK_LABEL(label);
      const gchar* wtitle=gtk_window_get_title(GTK_WINDOW(window));
      gtk_window_set_title(GTK_WINDOW(window),gtk_label_get_text(GTK_LABEL(newlabel)));
      gtk_label_set_text(GTK_LABEL(newlabel),wtitle);

      /* I am not sure if I could pass wtitle here*/
      return FALSE;
    }

执行时,窗口标题被成功交换,但标签没有。 另外,我在终端收到以下警告。

(2p1:12005): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

感谢任何帮助。

最佳答案

gtk_window_get_title() 返回窗口拥有的静态缓冲区。此缓冲区将在 gtk_window_set_title() 调用后更改。

要实现您想要的效果,您应该在回调函数中创建该字符串的副本。您可以使用 strdup(),但它可能无法在所有平台上使用。由于您使用的是依赖于 GLib 的 GTK+,因此您可以使用 g_strdup()。示例:

gchar* wtitle = g_strdup(gtk_window_get_title(GTK_WINDOW(window)));

记得在回调函数返回g_free(wtitle)之前释放它。

关于返回值,由于回调函数返回的是gboolean,所以不能返回wtitle。对于您的情况,我看不出返回 TRUEFALSE 之间有任何区别,因为无论如何都没有任何默认处理程序。如果您使用的不是标签,而是 GtkEntry 之类的东西,那么如果您不希望条目中的文本被您的输入键替换,您将返回 TRUE

关于c - 无效的 UTF-8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30026854/

相关文章:

c - AWK脚本到C脚本_converting。怎么样?

c - 包含数组包含相同结构的元素的结构

python - GtkOverlay 隐藏 GtkTextView

python - 在 Gtk.ComboBoxText 中设置占位符文本?

c - 如何删除结构体数组中的重复元素并打印输出

c - 在c中反转字符串数组的两种不同方法

c - C程序中的非规范终端模式缓冲区标准输出

c++ - GTKMM:截屏 DrawingArea?

c - C/gtk+ 中的全局列表

c# - 如何从 GTK 中的 TreeView 中删除多行#