使用GtkEntry
小部件编写一个简单的应用程序来处理用户的文本命令后,我想做一些设计更改。
截至目前,我在按键上使用信号挂钩。如果key(s)是指定值,则显示命令行并处理entry
小部件上的各种操作。比如说。
除了解析命令和保存/加载历史记录外。
我不满意这是如何拼接在一起的。命令解析成为以下的子集:
main_window -> mode_check -> command_line_act -> parse_cmd+execute
我认为一个好的方法是使用GtkEntry作为基础编写一个新的小部件 - 并在命令输入发送信号。所有内部功能如Ctrl + ...和历史记录都由新的小部件处理。
新小部件发出的信号,例如:
已经为此写了基础,但是当涉及发出多于一个参数的信号时,我很讨厌。
我有:
gtk_signal_emit(obj, sig, 0, command)
|
+---- string.
但是,(至少现在,最有可能更多/其他更多。):
gtk_signal_emit(obj, sig, 0, command, length)
gtk_emit_signal 错字固定。 Thanks to jku.。此外,现在使用 g_signal _
在小部件代码中:
static void
cmdline_class_init(CmdlineClass *klass)
{
我使用g_signal_new()作为一个参数:
cmdline_signals[CMDLINE_CMD] = g_signal_new(
"cmdline-cmd",
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET(CmdlineClass, cmdline),
NULL,
NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
1,
G_TYPE_STRING
);
正如我所看到的,对于两个论点,应该将其改为:
cmdline_signals[CMDLINE_CMD] = g_signal_new(
"cmdline-cmd",
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET(CmdlineClass, cmdline),
NULL,
NULL,
g_cclosure_user_marshal_VOID__STRING_INT,
G_TYPE_NONE,
2,
G_TYPE_STRING,
G_TYPE_INT
);
使用glib-genmarshal生成marshal.list持有的封送:
VOID:STRING,INT
这样可行,但在编译时给我一个警告:
warning: ISO C forbids conversion of object pointer to function pointer type
由glib-genmarshal生成的代码引起:
typedef void (*GMarshalFunc_VOID__STRING_INT) (gpointer data1,
gpointer arg_1,
gint arg_2,
gpointer data2);
register GMarshalFunc_VOID__STRING_INT callback;
/* GCC Warnig: conversion of object pointer to function => */
callback = (GMarshalFunc_VOID__STRING_INT) (
marshal_data ?
marshal_data :
cc->callback
);
这是错误的做法吗?有没有办法解决转换错误?等
作为一个注释:我对Gtk和Gui编程都很新。
有一些弃用我也想知道是否会影响代码/应该避免:
GSignalCMarshaller
?答案 0 :(得分:2)
此警告确实在某些信号编组代码上出现(带有-pedantic),而不仅仅出现在您的代码中。据我所知,你没有做错任何事 - 除了使用gtk_signal_emit()
(我假设你的意思是而不是gtk_emit_signal(),据我所知不存在):你不应该使用任何gtk_signal-prefixed code:那些东西都已弃用了。有关详细信息,请参阅reference。请改为使用GObject:g_signal_emit()
或g_signal_emit_by_name()
应该适合您。
你提到的信号编组器弃用是关于同样的事情:GObject现在处理与此相关的所有事情(已经很长时间了)。
作为实用的建议:经常添加信号签名的东西不值得麻烦,这也可能是你的情况:也许你的信号根本不需要命令字符串,信号处理程序可以只查询它with your_object_get_command()?
实用建议#2:考虑使用GTK + 3获取新代码。没有所有那些令人讨厌的东西让每个人感到困惑都很可爱。