在 gtk4檔案中,有一個函式gtk_builder_add_from_file用于加載builder.ui檔案的示例,我使用了相同的代碼,但我創建了builder.uiusing glade 應用程式,當我編譯并運行程式時,視窗內除了標題之外什么都沒有和我在 glade app 中定義的一樣
以下是內容builder.ui
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk " version="3.24"/>
<object class="GtkWindow" id="MainWindow">
<property name="can-focus">False</property>
<property name="title" translatable="yes">MyApp</property>
<property name="default-width">440</property>
<property name="default-height">250</property>
<signal name="destroy" handler="exit_app" swapped="no"/>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="Button">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
這是我用來加載檔案的代碼
#include <gtk/gtk.h>
#include <glib/gstdio.h>
static void print_hello(GtkWindow * window, gpointer data)
{
g_print("Clicked");
}
// renders the application
static void activate(GtkApplication * app, gpointer * user_data)
{
/* Construct a GtkBuilder instance and load our UI description */
GtkBuilder *builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "builder.ui", NULL);
// connect signal handlers to the constructed widgets
GObject * window = gtk_builder_get_object(builder,"MainWindow");
gtk_window_set_application(GTK_WINDOW(window), app);
gtk_widget_show(GTK_WIDGET(window));
// unload the builder (destroy)
g_object_unref(builder);
}
int main(int argc, char ** argv)
{
#ifdef GTK_SCRDIR
g_chdir(GTK_SCRDIR);
#endif
GtkApplication * app = gtk_application_new("org.gtk.application", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
int status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
它編譯得很好并且運行沒有任何錯誤但是沒有按鈕在視窗內顯示
uj5u.com熱心網友回復:
那是因為您使用的 GTK3 構建器 UI 代碼在 GTK4 中可能無效。對于給定的builder.ui檔案,GtkBox子屬性已在 GTK4 中洗掉。請參閱檔案中的相關部分。
因此,對于您的代碼來說,洗掉<packing> ... </packing>應該就足夠了。
或者,您可以gtk4-builder-tool通過運行將您的 GTK3 UI 定義轉換為 GTK4 gtk4-builder-tool simplify --3to4 --replace builder.ui(洗掉--replace標志以列印輸出stdout而不替換輸入檔案)
它為您的檔案提供以下輸出:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk" version="4.0"/>
<object class="GtkWindow" id="MainWindow">
<property name="title" translatable="1">MyApp</property>
<property name="default-width">440</property>
<property name="default-height">250</property>
<signal name="destroy" handler="exit_app" swapped="no"/>
<property name="child">
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="Button">
<property name="label" translatable="1">button</property>
<property name="focusable">1</property>
<property name="receives-default">1</property>
</object>
</child>
</object>
</property>
</object>
</interface>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517700.html
標籤:Cxmlgtk
