2014-03-26 11 views
1

GMenucomposite 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
+0

UI 파일 (또는 문제가있는 한 삭제 된 버전)을 게시 할 수도 있습니다. – nemequ

+0

이제 문제를 재현하는 데 필요한 모든 것을 추가했습니다. –

+0

'on_clicked' 핸들러를 생략 했으므로 Gtk-WARNING이 추가로 발생하지만 중요하지 않습니다. –

답변

1

많은 시행 착오 끝에 문제를 발견했습니다.

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

내가 그 지시를 제거하고 대신 창 클래스의 contstructor에 주장을 명시 적 show();를 추가 더 이상 화재 및 경우 : UI 파일에서

볼에 창을 설정하는 지시어가있다 GMenu는 템플릿으로 작업 중입니다 :).

0

애플리케이션을 활성화 상태로 유지하십시오.

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

나는 그것을 시도했지만 도움이되지 않았다.나는 심지어'Application *'을 시도했다. –

1

매우 이상하지만 응용 프로그램 ID를 다른 것으로 변경하면 작동합니다. 특히, 하이픈은 우아하지 않지만, gtk-mumble 대신 gtkmumble을 시도해보십시오. 그런 다음 add_window (new MainWindow (this));을 수행해야합니다. 이 두 단계로 시작해야합니다.

+0

다른 것을 바꿨습니까? application-id를'net.antiochus.gtkmumble'으로 변경하고'add_window' 호출을 추가했지만 여전히 동일한 문제가 있습니다. –

+0

코드는 다음과 같습니다. http://pastebin.com/Ui5h4VY8 아마 .ui 경로도 변경했습니다. 콘솔에 경고를 붙여주십시오. – lethalman

+0

http://pastebin.com/Ui5h4VY8의 코드를 사용하여 ressource.xml을 수정하여 업데이트 된 코드에서와 동일한 접두사를 사용해야했습니다. 문제가 계속 발생합니다. –