无效的 UTF-8 字符串
Invalid UTF-8 string
我试图将 window 标题与 window 内的标签交换
按键。
下面是我的代码:
#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;
}
执行时,window 标题已成功交换,但标签未交换。
另外,我在终端收到以下警告。
(2p1:12005): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()
感谢任何帮助。
gtk_window_get_title()
returns 属于 window 的静态缓冲区。此缓冲区将在 gtk_window_set_title()
调用后更改。
要实现您想要的效果,您应该在回调函数中创建该字符串的副本。您可以使用 strdup()
,但它可能不适用于所有平台。由于您正在使用依赖于 GLib 的 GTK+,因此您可以使用 g_strdup()
。示例:
gchar* wtitle = g_strdup(gtk_window_get_title(GTK_WINDOW(window)));
记得在回调函数 returns 和 g_free(wtitle)
之前释放它。
至于return值,由于回调函数returnsgboolean
,不能returnwtitle
。对于您的情况,我看不出 returning TRUE
或 FALSE
之间有任何区别,因为无论如何都没有任何默认处理程序。如果您使用的不是标签,而是 GtkEntry 之类的东西,那么如果您不希望条目中的文本被您的输入键替换,您将 return TRUE
。
我试图将 window 标题与 window 内的标签交换 按键。
下面是我的代码:
#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;
}
执行时,window 标题已成功交换,但标签未交换。 另外,我在终端收到以下警告。
(2p1:12005): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()
感谢任何帮助。
gtk_window_get_title()
returns 属于 window 的静态缓冲区。此缓冲区将在 gtk_window_set_title()
调用后更改。
要实现您想要的效果,您应该在回调函数中创建该字符串的副本。您可以使用 strdup()
,但它可能不适用于所有平台。由于您正在使用依赖于 GLib 的 GTK+,因此您可以使用 g_strdup()
。示例:
gchar* wtitle = g_strdup(gtk_window_get_title(GTK_WINDOW(window)));
记得在回调函数 returns 和 g_free(wtitle)
之前释放它。
至于return值,由于回调函数returnsgboolean
,不能returnwtitle
。对于您的情况,我看不出 returning TRUE
或 FALSE
之间有任何区别,因为无论如何都没有任何默认处理程序。如果您使用的不是标签,而是 GtkEntry 之类的东西,那么如果您不希望条目中的文本被您的输入键替换,您将 return TRUE
。