.h文件定义(popwindowf.h), TEST_TYPE_WINDOW宏是要创建的窗口样式。
#pragma once
#include
G_BEGIN_DECLS
#define TEST_TYPE_WINDOW (test_window_get_type())
G_DECLARE_FINAL_TYPE (TestWindow, test_window, TEST, WINDOW, GtkWindow)
G_END_DECLS
g_object_new时生产TEST_TYPE_WINDOW,后面的参数是窗口的属性。
window = g_object_new (TEST_TYPE_WINDOW,
"default-height", 550, "default-width", 800,
"title", "Nice window!",
NULL);
在ui文件里的名字叫 TestWindow ,如果是主窗体,则是项目的 工程名+Window ,如 WithcamblaWindow。 ui文件里的template class名字,要和.h文件中的名字一致。
800
1200
.c文件中的名字也是一致的, TestWindow是产生的新窗体的 handle
struct _TestWindow
{
GtkWindow parent_instance;
/* Template widgets */
GtkHeaderBar *header_bar;
GtkLabel *label1;
GtkButton *button1;
GtkButton *button2;
GtkGrid *grid1;
};
G_DEFINE_TYPE (TestWindow, test_window, GTK_TYPE_WINDOW)
创建窗体时有两个接口,一是窗口作为一个class的初始化init,另一个是窗体本身的初始化init
static void
test_window_class_init (TestWindowClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
gtk_widget_class_set_template_from_resource (widget_class, "/org/mongnewer/test/popwindowf.ui");
gtk_widget_class_bind_template_child (widget_class, TestWindow, header_bar);
gtk_widget_class_bind_template_child (widget_class, TestWindow, label1);
gtk_widget_class_bind_template_child (widget_class, TestWindow, button1);
gtk_widget_class_bind_template_child (widget_class, TestWindow, button2);
gtk_widget_class_bind_template_child (widget_class, TestWindow, grid1);
static void
test_window_init (TestWindow *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
g_signal_connect(GTK_WINDOW(self), "destroy", G_CALLBACK(closewindow), self);
}
如果要创建一个叫Passwd窗体,则是PASSWD_TYPE_WINDOW(passwd_window_get_type()),
G_DECLARE_FINAL_TYPE (PasswdWindow, passwd_window, PASSWD, WINDOW, GtkWindow),ui文件中template class = PasswdWindow,如此,可以考贝已有的.h和.c,然后改动一个名称,注意保持.h .c ui间的名称一致。创建窗体时,用GtkWindow,或GtkApplicationWindow, 也是注意保持.h .c ui间窗体样式的一致性。
meson和make一样,在meson.build中要加入窗体的 .c, make时就一同make了
新窗体的ui文件要写到resource xml 配置中
写起来挺啰嗦,实现起来只是考贝、修改,名称不一致编译时也会有警告提示的。
如果cambalache不能显示图形,关闭cambalache软件使用硬件加速功能,尤其是在虚拟中运行cambalache,因为没有加速的硬件,所以要关闭它,否则不能显示图形。cambalache是flatpak包,需要安装flatseal包,用flatseal关闭cambalache的硬件加速功能。
ubuntu 22.04 mate-desktop 运行gnome-builder遇到闪退问题的话,sudo apt install tasksel, 运行tasksel可选择不同的桌面。
选择gnome桌面可解决问题, 窗口管理器依然选用lightdm,不需要选用 gdm3 管理器。问题遇到了、处理掉,就写在这里吧。