从 XML 创建的 GTK4 窗口,在 Run() 后立即关闭

问题描述 投票:0回答:1

根据文档,只要使用“g_application_run”,窗口似乎就应该保持打开状态,并且执行参考增量。因为我这样做,所以我不确定我做错了什么导致 GUI 显示但立即关闭:

 GtkBuilder* myGtkBuilder;
 GtkWidget* myGtkWindow;
 GtkApplication* myGtkApp;
 
 // Since we will be using an xml design file, the passed 'app' parameter won't be used 
 static void activate_cb(GtkApplication* app, gpointer user_data) {
    
     // Load the UI from the XML file
     myGtkBuilder = gtk_builder_new_from_file("gtk4.glade");
 
     // Get the window widget from the builder
     myGtkWindow = GTK_WIDGET(gtk_builder_get_object(myGtkBuilder, "window"));
 
     // (Optional) Connect signals to the GUI elements here if needed
 
     // Show the window without using gtk_widget_set_visible(myGtkWindow, true);
     gtk_window_present(GTK_WINDOW(myGtkWindow));
     g_object_ref(myGtkWindow); // Increase reference count
 
     // Clean up resources
     g_object_unref(myGtkBuilder);
 }
 
 
 int main(int argc, char *argv[]) 
 { 
     int status;
     GError* error = NULL;
     
     gtk_init(&argc, &argv);  // Needed?
 
     myGtkApp = gtk_application_new("myAppId.id", G_APPLICATION_DEFAULT_FLAGS);  // vs gtk_application_window_new?  G_APPLICATION_DEFAULT_FLAGS vs G_APPLICATION_FLAGS_NONE
     g_signal_connect(myGtkApp, "activate", G_CALLBACK(activate_cb), NULL);
     status = g_application_run(G_APPLICATION(myGtkApp), argc, argv);
 
     // Free resources
     g_object_unref(myGtkApp);
 
     return status;
 }

我尝试了几个 XML 文件,所有的行为都相同:

 <?xml version="1.0"?>
 <interface>
   <object class="GtkWindow" id="window">
     <property name="title">Checkboxes Example</property>
     <child>
       <object class="GtkBox" id="box">
         <property name="orientation">GTK_ORIENTATION_VERTICAL</property>
         <child>
           <object class="GtkCheckButton" id="checkbox1">
             <property name="label">Checkbox 1</property>
           </object>
         </child>
         <child>
           <object class="GtkCheckButton" id="checkbox2">
             <property name="label">Checkbox 2</property>
           </object>
         </child>
       </object>
     </child>
   </object>
 </interface>

不幸的是,SO 上的另外 2 个类似问题对我不起作用(python 而不是 c)

c gtk gtk4
1个回答
0
投票

引用文档:

“GTK 4 删除了 gtk_main_* 系列 API。 推荐的替代品是 GtkApplication。 ... 目前,GtkApplication 处理 GTK 初始化、应用程序唯一性、 会话管理,提供一些基本的脚本能力和桌面 shell 集成 通过导出操作和菜单并管理顶级窗口列表 生命周期自动与您的应用程序的生命周期相关联。”

您的问题是您没有连接到应用程序的窗口。 所以你的应用程序没有任何事可做,这就是它立即关闭的原因。

以下简单示例展示了它是如何工作的。

#include <gtk/gtk.h>

static void
activate (GtkApplication* app,
          gpointer        user_data)
{
  GtkWidget *window;

  window = gtk_application_window_new (app);
  gtk_widget_set_visible(window,TRUE);
}

int
main (int    argc,
      char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("holger.gtk.simpleexample", G_APPLICATION_DEFAULT_FLAGS);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

当然,您也可以使用构建器编写自己的窗口类,然后将此类连接到应用程序。 您可以在这里找到示例。

使用 GTK4、C 和 XML 从模板创建您自己的类

© www.soinside.com 2019 - 2024. All rights reserved.