GMenu
과 composite templates
을 함께 사용하려고합니다.복합 템플릿을 사용할 때 GMenu가 더 이상 작동하지 않는 이유는 무엇입니까?
GTK-mumble.vala
using GLib;
using Gtk;
namespace GtkMumble {
[GtkTemplate (ui = "/net/antiochus/gtk-mumble/gtk_mumble.ui")]
public class MainWindow : Gtk.ApplicationWindow {
public MainWindow (Gtk.Application app) {
Object (application: app, title: "gtk-mumble");
var about_action = new SimpleAction ("about", null);
about_action.activate.connect (this.about_cb);
this.add_action (about_action);
this.show();
}
void about_cb (SimpleAction simple, Variant? parameter) {
print ("This does nothing. It is only a demonstration.\n");
}
[GtkCallback]
public void on_destroy()
{
application.quit();
}
}
public class Application : Gtk.Application {
public Application() {
Object (application_id: "net.antiochus.gtk-mumble");
}
protected override void activate() {
assert(this is Gtk.Application);
new MainWindow (this);
}
protected override void startup() {
base.startup();
var menu = new GLib.Menu();
menu.append ("About", "win.about");
menu.append ("Quit", "app.quit");
this.app_menu = menu;
var quit_action = new SimpleAction ("quit", null);
quit_action.activate.connect (this.quit);
this.add_action (quit_action);
}
}
int main (string[] args) {
return new Application().run (args);
}
}
gtk_mumble.ui
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.0 -->
<interface>
<requires lib="gtk+" version="3.0"/>
<template class="GtkMumbleMainWindow" parent="GtkApplicationWindow">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">gtk-mumble</property>
<property name="default_width">499</property>
<property name="default_height">399</property>
<signal name="destroy" handler="on_destroy" swapped="no"/>
<child>
<object class="GtkButton" id="connect_button">
<property name="label" translatable="yes">Connect</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_clicked" swapped="no"/>
</object>
</child>
</template>
</interface>
resources.xml에
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/net/antiochus/gtk-mumble">
<file compressed="true" preprocess="xml-stripblanks">gtk_mumble.ui</file>
</gresource>
</gresources>
빌드 명령 :
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 템플릿이로드되고 단추가 있고 신호가 작동하는 경우).
속성을 모두 제거하면 어설 션이 실패하지 않지만 나머지 UI는 더 이상 작동하지 않습니다.
편집 : 해결 방법으로 템플릿으로 Gtk.Box
을 만들고이 상자를 기본 창에 추가합니다. 그게 효과가 있지만, 나는 여전히 직접적인 접근법이 왜 그렇게되지 않는지 알고 싶습니다. 내가 사용하고
버전은 다음과 같습니다
-
이
- 발라 0.22.1
- 입심 2.40.0 (나는 또한 0.23.3와 시도)
- GTK + 3.12.0
UI 파일 (또는 문제가있는 한 삭제 된 버전)을 게시 할 수도 있습니다. – nemequ
이제 문제를 재현하는 데 필요한 모든 것을 추가했습니다. –
'on_clicked' 핸들러를 생략 했으므로 Gtk-WARNING이 추가로 발생하지만 중요하지 않습니다. –