基于不同 OS 上的 .glade 文件的 GTK+ 3 应用程序

GTK+ 3 applications based on .glade file on different OS

我在 C++ 上编写了小型 GTK+ 应用程序,它在 Debian x64 和 Gnome 3 上对我来说运行良好。但是,它在 Lubuntu x86 上不起作用。所以我编写了测试程序,它使用我的 gui.glade 文件中的一些小部件创建 window,它在 Lubuntu 上不起作用,但在 Debian 上起作用。这是测试代码:

#include <gtk/gtk.h>

void create_window()
{
    GtkBuilder *builder; 
    builder = gtk_builder_new();

    gtk_builder_add_from_file (builder, "src/gui.glade", NULL);
    gtk_builder_connect_signals (builder, NULL);

    GtkWidget *window;
    window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));

    gtk_window_set_title (GTK_WINDOW (window), "Startup Settings");
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

    gtk_widget_show (window);
}

int main (int argc, char *argv[])
{
    gtk_init (&argc, &argv);
    create_window();

    gtk_main ();
}

我用g++编译:

g++ -std=c++11 `pkg-config --cflags gtk+-3.0` test.cpp -rdynamic `pkg-config --libs gtk+-3.0`

错误输出:

** (a.out:17864): WARNING **: Error retrieving accessibility bus address: org.freedesktop.DBus.Error.ServiceUnknown: The name org.a11y.Bus was not provided by any .service files

(a.out:17864): Gtk-CRITICAL **: gtk_window_set_title: assertion 'GTK_IS_WINDOW (window)' failed

(a.out:17864): GLib-GObject-WARNING **: invalid (NULL) pointer instance

(a.out:17864): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed

(a.out:17864): Gtk-CRITICAL **: gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' faile

您可以下载gui.gladehere.

我刚刚打开我的 gui.glade 文件属性,问题变得很明显。默认情况下,Glade 需要在您的计算机上安装最新版本的 GTK+。我使用的是 Debian unstable,所以对我来说它是 GTK 3.20。当我在稳定系统上测试它时,它不起作用,因为它上面安装了 GTK 3.18。

为了解决这个问题,我通过 Glage 更改了我的 gui.glade 属性,并将所需的 GTK 版本降低到 3.10。