如何用C关闭GTK窗口

如何用C关闭GTK窗口,c,gtk,C,Gtk,我在做一个小项目,我有一个全屏GUI(Glade、GTK和C),需要给用户一个关闭屏幕的方法(很明显,由于窗口是全屏的,所以窗口管理器不可用) 当我试图编译这段代码时,问题就出现了 //close sidebar1 void on_window_sidebar1_back_clicked() { gtk_window_close (GtkWindow *window); } 我收到以下错误 /usr/bin/arm-linux-gnueabihf-gcc -c -g -O

我在做一个小项目,我有一个全屏GUI(Glade、GTK和C),需要给用户一个关闭屏幕的方法(很明显,由于窗口是全屏的,所以窗口管理器不可用)

当我试图编译这段代码时,问题就出现了

//close sidebar1
 void on_window_sidebar1_back_clicked()
 {
    gtk_window_close (GtkWindow *window);
 }
我收到以下错误

    /usr/bin/arm-linux-gnueabihf-gcc -c -g -O0 -Wall -pthread -pipe src/main.c `pkg-config --cflags --libs gtk+-3.0` -o main.o
src/main.c: In function 'on_window_sidebar1_back_clicked':
src/main.c:61:2: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'gtk_window_close'
  gtk_window_close (GtkWindow *window);
  ^
src/main.c:61:20: error: expected expression before 'GtkWindow'
  gtk_window_close (GtkWindow *window);
                    ^
makefile:30: recipe for target 'main.o' failed
make: *** [main.o] Error 1
我试图按照文档进行操作,但似乎失败得很厉害

有人有什么想法吗

附言

如果有人感兴趣,这里是完整的main.c。这是我第一次用gtk尝试C,所以不要太苛刻,谢谢(=

#包括
GtkWidget*g_lbl_试验;
GtkWidget*g_lbl_计数;
int main(int argc,char*argv[])
{
GtkBuilder*builder;
GtkWidget*窗口;
gtk_init(&argc,&argv);
builder=gtk_builder_new();
gtk_生成器_从_文件添加_(生成器,“glade/window_main.glade”,NULL);
窗口=GTK_小部件(GTK_生成器_获取_对象(生成器,“窗口主”);
gtk_builder_connect_信号(builder,NULL);
//标签的指针(…用于按键)
g_lbl_test=GTK_小部件(GTK_builder_get_对象(builder,lbl_test));
g_lbl_count=GTK_小部件(GTK_builder_get_对象(builder,lbl_count));
g_object_unref(建筑商);
gtk_widget_show(窗口);
//gtk_window_全屏(GtkWindow*window);//不知道如何使用,与gtk_window_close相同
gtk_main();
返回0;
}
//按下按钮(只是一个测试,以确保窗口没有冻结)
点击次数时无效()
{
静态无符号整数计数=0;
字符stru计数[30]={0};
gtk_标签设置文本(gtk_标签(g_lbl_测试),“测试成功!”);
计数++;
sprintf(str_计数,“%d”,计数);
gtk_标签设置文字(gtk_标签(g_lbl_计数)、str_计数);
}
//侧边栏1
侧边栏上的空白\u 1\u单击()
{
GtkBuilder*builder;
GtkWidget*窗口;
builder=gtk_builder_new();
gtk_生成器_从_文件添加_(生成器,“glade/window_main.glade”,NULL);
window=GTK_小部件(GTK_构建器_获取_对象(构建器,“window_边栏1”);
gtk_widget_show(窗口);
}
//关闭侧边栏1
窗口上的空白\u侧边栏1\u返回\u单击()
{
gtk_车窗关闭(GtkWindow*车窗);
}
//我被要求关窗
窗口上的无效\u主\u销毁()
{
gtk_main_quit();
}

您可能应该打电话给

 gtk_close_window(window);
但是
窗口
应该来自某个地方

(您可以使用带有连接的Gtk闭包,或带有客户端数据的回调等,或者以某种方式将
窗口
存储在全局变量中,等等。)

阅读更多关于C编程的信息,然后阅读一些关于和的信息,然后阅读更多关于和Gobject的机制的信息

(您的代码显示了很多混乱;我建议在阅读了一本很好的C编程书籍后再阅读本章;顺便说一句,我建议先编写一些不是全屏的内容,然后再对其进行改进)


编译时不要忘记启用所有警告和调试信息,即使用
gcc-Wall-Wextra-g
(以及其他参数,可能使用
$(pkg config--cflags gtk+-3.0)
$(pkg config--libs gtk+-3.0)
进行链接).

注意!这不符合任何行业标准,而且存在多个缺陷。我不会因此而赚钱或成名,所以我唯一的要求是它能正常工作。阅读本文时请考虑到这一点

我用学到的知识对代码进行了编辑,这似乎奏效了:

void on_sidebar_1_clicked(int argc, char *argv[])
{
    GtkBuilder      *builder; 

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "glade/window_sidebar1.glade", NULL);  //a whole own file for the second window

    secondWindow = GTK_WIDGET(gtk_builder_get_object(builder, "window_sidebar1")); //secondWindow is defined at the start of main.c like this: "GtkWidget *secondWindow = NULL;" so that both callbacks can use it.
    gtk_builder_connect_signals(builder, NULL);


    gtk_widget_show(secondWindow);
    gtk_main();

}


void on_sidebar1_back_clicked()
 {
    gtk_widget_destroy(GTK_WIDGET(secondWindow)); //here we call the widget to be closed instead of the window. Seems to work a lot better than the gtk_window_close, dunno why.
 }

这段代码写得很快(而且很快),所以有点粗糙。我也对glade文件做了一些更改,如果有人需要这些文件的参考,请询问。就我而言,这是我问题的答案。此外,我建议学习C和GTK(如Basile Starynkevitch所说)在你开始做这类事情之前,我没有时间也没有动机这么做。

什么?你为什么在这里写声明?用一个实际的
GtkWindow*
指针指向你的窗口调用这个函数怎么样?gtk\u window\u close(&window)也许?或者gtk\u window\u close(window)?就像在gtk\u window\u close中一样(GtkWindow*窗侧边栏1);//window_sidebar1是我的window的ID这是无效的C。在函数调用中,你不能指定类型,只能提供值。另一方面,你的函数签名看起来太空了,不正确。该函数连接到哪个信号?谢谢你的帮助,但我想我只需要点击一些基本教程就可以得到挂起的o又是f C。严重的PEBCAS事件。我应该删除这篇文章还是把它留在这里作为“未解决”?PEBCAS是什么意思?如果我记得的话,椅子和屏幕之间存在问题correctly@BasileStarynkevitch你甚至更加离谱。除非你坐在桌面上,背着键盘打字,否则“键盘和屏幕之间”就没有任何意义了你的意思是在键盘和椅子之间。@Gerhardh:Basile的意思是“在键盘和沙发之间”,显然
:-)
对不起,但这个代码也没有意义。您不会将
argc
argv
传递给回调,也不会在回调中调用
gtk_init
。这应该在
main
函数中完成。此外,没有GTK回调接受0个参数,因此在侧边栏1上单击的
的签名也肯定是错误的。嘿,这当然是愚蠢的,但它是有效的。不要将其用于任何工业标准,可能应添加。如果你不喜欢,就直接否决它(=我看看我是否可以在没有init的情况下让它工作,但我发誓没有init我会遇到一些问题。可能只是一些分号,我在没有它们的情况下漏掉了。libforce,谢谢你的提示!在创建新窗口时,如果没有init,它工作得很好,如果不是更好的话(稍微快一点,但没什么明显的)
void on_sidebar_1_clicked(int argc, char *argv[])
{
    GtkBuilder      *builder; 

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "glade/window_sidebar1.glade", NULL);  //a whole own file for the second window

    secondWindow = GTK_WIDGET(gtk_builder_get_object(builder, "window_sidebar1")); //secondWindow is defined at the start of main.c like this: "GtkWidget *secondWindow = NULL;" so that both callbacks can use it.
    gtk_builder_connect_signals(builder, NULL);


    gtk_widget_show(secondWindow);
    gtk_main();

}


void on_sidebar1_back_clicked()
 {
    gtk_widget_destroy(GTK_WIDGET(secondWindow)); //here we call the widget to be closed instead of the window. Seems to work a lot better than the gtk_window_close, dunno why.
 }