Gtk 当我使用复合模板时,为什么我的GMenu不再工作?

Gtk 当我使用复合模板时,为什么我的GMenu不再工作?,gtk,gtk3,vala,gtkbuilder,Gtk,Gtk3,Vala,Gtkbuilder,我试图让GMenu和组合模板协同工作 gtk-mumble.vala 使用GLib; 使用Gtk; 名称空间GtkMumble{ [gtk模板(ui=“/net/antiochus/gtk mumble/gtk_mumble.ui”)] 公共类主窗口:Gtk.ApplicationWindow{ 公共主窗口(Gtk.Application应用程序){ 对象(应用程序:app,标题:“gtk mumble”); var about_action=new SimpleAction(“about”,n

我试图让
GMenu
组合模板
协同工作

gtk-mumble.vala

使用GLib;
使用Gtk;
名称空间GtkMumble{
[gtk模板(ui=“/net/antiochus/gtk mumble/gtk_mumble.ui”)]
公共类主窗口:Gtk.ApplicationWindow{
公共主窗口(Gtk.Application应用程序){
对象(应用程序:app,标题:“gtk mumble”);
var about_action=new SimpleAction(“about”,null);
about_action.activate.connect(this.about_cb);
this.add_action(关于_action);
this.show();
}
void about_cb(SimpleAction simple,Variant?参数){
打印(“这不起任何作用。它只是一个演示。\n”);
}
[GtkCallback]
销毁时的公共无效()
{
application.quit();
}
}
公共类应用程序:Gtk.Application{
公开申请(){
对象(应用程序_id:“net.antiochus.gtk mumble”);
}
受保护的覆盖无效激活(){
断言(这是Gtk.Application);
新主窗口(此窗口);
}
受保护的覆盖无效启动(){
base.startup();
var menu=newglib.menu();
menu.append(“About”、“win.About”);
menu.append(“退出”、“应用程序退出”);
this.app_menu=菜单;
var quit_action=new SimpleAction(“quit”,null);
退出\u action.activate.connect(this.quit);
this.add\u操作(quit\u操作);
}
}
int main(字符串[]args){
返回新应用程序().run(args);
}
}
gtk_mumble.ui


真的
假的
咕哝
499
399
连接
真的
真的
真的
resources.xml


gtk_mumble.ui
生成命令:

glib-compile-resources resources.xml --target=resources.c --sourcedir=. --c-name gtk_mumble --generate-source
valac -o gtk-mumble gtk-mumble.vala resources.c --target-glib=2.40 --pkg gtk+-3.0 --pkg gee-0.8 --gresources resources.xml
该代码在运行时导致断言失败:

(gtk_mumble:19708): Gtk-CRITICAL **: gtk_application_get_menubar: assertion 'GTK_IS_APPLICATION (application)' failed
GMenu
不起作用,但UI的其余部分起作用(例如,UI模板已加载,按钮已在那里,且信号正常)

当我删除所有
[Gtk..]
属性时,
GMenu
会工作,断言不会失败,但当然UI的其余部分不再工作

编辑:作为一种解决方法,我正在创建一个带有模板的
Gtk.Box
,并将此框添加到主窗口。这是可行的,但我仍然想知道为什么直接方法不行

我使用的版本有:

  • Vala0.22.1(我也尝试了0.23.3)
  • 能说会道2.40.0
  • Gtk+3.12.0

尝试使应用程序保持活动状态:

var app = new Application ();
return app.run (args);

好吧,这很奇怪,但是将应用程序id更改为其他代码是可行的。特别是,连字符似乎不优雅,请尝试使用gtkmumble而不是gtk mumble。
然后你需要做
add_窗口(newmainwindow(this))。这两个步骤应该足以让您开始。

经过反复尝试,我发现了问题所在

在ui文件中,有一条指令将窗口设置为可见:

<property name="visible">True</property>
True

如果我删除该指令,而是添加一个显式的
show()
到窗口类的contstructor,断言不再触发,GMenu正在使用模板:)。

我尝试过,但没有帮助。我甚至尝试了
应用程序*
。如果您也可以发布UI文件(或精简版本,只要它也显示问题),这可能会有所帮助。我现在已经添加了重现问题所需的所有内容。我在单击
处理程序时忽略了
,因此这将导致额外的Gtk警告,但这不重要。你还改变了什么吗?我将应用程序id更改为
net.antiochus.gtkmumble
,并添加了
add_window
调用,但它仍然存在相同的问题。代码如下:可能我还更改了.ui路径。请在控制台中粘贴任何警告。使用中的代码,我必须修复ressource.xml以使用与更新代码中相同的前缀。问题仍然存在。您使用的是什么版本的Vala、GLib和GTK+?我把我的添加到了问题中。我回家后会添加版本,不过你可以看看猴面包树,如果这对你有帮助的话:。它在窗口上使用gaapplication、gmenus和gtktemplate。主/应用程序/窗口部分很容易阅读。