Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Gtk&x2B;回调函数和信号有助于_C_Gcc_Callback_Gtk - Fatal编程技术网

C Gtk&x2B;回调函数和信号有助于

C Gtk&x2B;回调函数和信号有助于,c,gcc,callback,gtk,C,Gcc,Callback,Gtk,我有下面的例子,它在“增加-减少”标题下显示了这一点 #包括 基特计数=0; char-buf[5]; 无效增加(GtkWidget*小部件、gpointer标签) { 计数++; sprintf(buf,“%d”,计数); gtk_标签_设置_文本(标签,buf); } 无效减少(GtkWidget*小部件,gpointer标签) { 计数--; sprintf(buf,“%d”,计数); gtk_标签_设置_文本(标签,buf); } int main(int argc,字符**argv){

我有下面的例子,它在“增加-减少”标题下显示了这一点

#包括
基特计数=0;
char-buf[5];
无效增加(GtkWidget*小部件、gpointer标签)
{
计数++;
sprintf(buf,“%d”,计数);
gtk_标签_设置_文本(标签,buf);
}
无效减少(GtkWidget*小部件,gpointer标签)
{
计数--;
sprintf(buf,“%d”,计数);
gtk_标签_设置_文本(标签,buf);
}
int main(int argc,字符**argv){
GtkWidget*标签;
GtkWidget*窗口;
GtkWidget*框架;
GtkWidget*plus;
GtkWidget*减号;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
gtk_窗口设置默认大小(gtk_窗口(窗口),250,180);
gtk_窗口设置标题(gtk_窗口(窗口),“+-”;
框架=gtk_固定_新();
gtk_容器添加(gtk_容器(窗口),框架);
plus=gtk_按钮_新_,带_标签(“+”);
gtk_widget_set_size_请求(加80,35);
gtk_固定放置(gtk_固定(框架),加上,50,20);
减=gtk_按钮_新_,带_标签(“-”);
gtk_widget_set_size_请求(减,80,35);
gtk_fixed_put(gtk_fixed(帧),减号,50,80);
标签=gtk_标签_新(“0”);
gtk_固定放置(gtk_固定(框架),标签,190,58);
gtk_小部件_全部显示(窗口);
g_信号_连接(窗口,“销毁”,
G_回调(gtk_main_quit),NULL);
g_信号_连接(加上“点击”,
G_回调(增加),标签);
g_信号_连接(减去“点击”,
G_回调(减少),标签);
gtk_main();
返回0;
}
我想知道的是,
g_信号连接(加上“点击”,g_回调(增加),标签)函数将“标签”发送到函数increase,其参数为
void increase(GtkWidget*widget,gpointer label)
。现在,在递增函数中,
gtk_label\u set_text()
函数要求数据类型为
GtkLabel
作为其第一个参数,但我只看到
GtkWidget
变量和空指针
label
作为递增函数的参数。如果是这样,那么gtk_label_set_text()如何工作?

在C(但不是C++)中,您可以隐式地将
void*
转换为指向任何其他类型的指针。使用
malloc
分配内存时非常常见,它返回一个
void*

int *myIntArray = malloc(10 * sizeof(int));  // allocate array of 10 ints
您的代码也在做同样的事情,只是通过参数传递:

void gtk_label_set_text(GtkLabel *label, const char *text);
void *label = ...;
gtk_label_set_text(label, "some string");  // label is implicitly cast from
                                           // void* to GtkLabel*

谢谢,还有一件事,为什么我们要在增加函数中包含
GtkWidget*小部件
?@sil3nt:
GtkWidget*小部件
,因为函数必须有一个非常特定的原型。
GtkButton::clicked
回调要求回调函数具有该签名,它将传递一个
GtkWidget*
作为第一个参数。如果您的回调具有错误的签名,您将收到错误的参数,并且很可能会崩溃。因此,递增函数的第一个参数将通过
g_signal_connect(加上“clicked”,g_callback(递增),label)自动传入
void gtk_label_set_text(GtkLabel *label, const char *text);
void *label = ...;
gtk_label_set_text(label, "some string");  // label is implicitly cast from
                                           // void* to GtkLabel*