5

我在 Genie 中找不到有关“Gtk.Application”的信息或示例。

在 Genie 中使用 Gtk.Application 类的正确方法是什么?

美好的一天,谢谢

编辑:我不知道这是否是最好的方法,但我的代码是这样的:

// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
uses Gtk

class MyApplication : Gtk.Application   
    def override activate ()        
        var window = new Gtk.ApplicationWindow (this)
        window.title = "Welcome to GNOME"
        window.set_default_size (400, 400)
        window.show ()

init
    new MyApplication ().run (args)
4

2 回答 2

7

您的示例对我来说似乎是一个很好的开始,但我认为您应该添加一个应用程序 ID 和一些应用程序标志。

三个很好的资源是GTK+3 参考手册的 GtkApplication 文档、GNOME Wiki“HowDoI”部分的页面“使用 GtkApplication”GIO 参考手册的 GApplication 文档。GApplication 或 Vala 绑定中的 GLib.Application 是 GtkApplication 的父类。

“HowDoI”页面建议:

GtkApplication 没有为你实现 main() 。你必须自己这样做。你的 main() 函数应该尽可能小,除了创建 GtkApplication 并运行它之外几乎什么都不做。“真正的工作”应该始终响应 GtkApplication 发出的信号来完成。

main()在 Genie 中的功能是:

init
    new MyApplication().run( args )

这就像你能得到的一样简单。

“HowDoI”页面还建议:

当您的应用程序启动时,将触发启动信号。这使您有机会执行与显示新窗口没有直接关系的初始化任务。在此之后,根据应用程序的启动方式,下一步将调用 activate 或 open。

您没有使用示例执行任何启动任务,这很好。所以没有必要使用startup信号,但是你activate通过用def override activate (). activate当 Gtk.Application 运行时,它实际上是默认信号,但是当设置适当的时候,可以发出替代信号ApplicatonFlags。例如,如果HANDLES_OPEN设置了标志,则open如果存在未解析的命令行参数,则将发送信号。未解析的参数被视为文件名或 URI。默认标志是FLAGS_NONE,稍后将在示例代码中明确说明。

GTK+3 参考手册中关于 GtkApplication 的部分指出:

目前,GtkApplication 处理 GTK+ 初始化、应用程序唯一性、会话管理,通过导出操作和菜单提供一些基本的脚本性和桌面外壳集成,并管理其生命周期自动与应用程序生命周期相关联的顶级窗口列表。 . 如果没有给出应用程序 ID,那么某些功能(最显着的应用程序唯一性)将被禁用。只有 GTK+ 3.6 或更高版本才允许使用空应用程序 ID。

应用程序 ID 应由至少两个用点分隔的名称组成。如果应用程序第二次运行,则第二个实例的窗口成为第一个应用程序的一部分,但随后关闭第二个应用程序实例。这是应用程序唯一性功能,可以使用ApplicationFlags.NON_UNIQUE. 应用程序使用应用程序 ID 在会话总线上注册。如果您使用的是 Linux,您可以使用D-Feet之类的工具来查看应用程序出现在会话总线上,以及再次运行应用程序时会发生什么(您需要刷新视图)。

一些代码的时间:

// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
[indent=4]
uses Gtk

init
    new MyApplication( "org.genie.Example.SimpleGtkApplication",
                     ApplicationFlags.FLAGS_NONE
                     ).run( args )

class MyApplication:Gtk.Application
    construct( application_id:string, flags:ApplicationFlags )
        if !id_is_valid( application_id )
            error( "application id %s is not valid", application_id )
        this.application_id = application_id
        this.flags = flags

    def override activate ()
        var window = new Gtk.ApplicationWindow( this )
        window.title = "Welcome to GNOME"
        window.set_default_size( 400, 400 )
        window.show_all()

这会添加一个应用程序 ID 并使其ApplicationFlags显式化。

于 2017-02-01T01:33:14.023 回答
5

嗯,我还在进步。

我用运行一个简单屏幕截图的 Gtk.Application 编写了这段代码:

// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
uses Gtk

init
    new MyApplication( "captura.escritorio",
        ApplicationFlags.FLAGS_NONE
        ).run( args )

class MyApplication:Gtk.Application

    construct( application_id:string, flags:ApplicationFlags )
        if !id_is_valid( application_id )
            error( "application id %s is not valid", application_id )
        this.application_id = application_id
        this.flags = flags

    def override activate ()
        var window = new Gtk.ApplicationWindow( this )
        window.title = "Escritorio"             
        window.border_width = 10        
        window.window_position = WindowPosition.CENTER      

        var grid = new Gtk.Grid()
        window.add (grid)

        var boton = new Button.with_label ("Capturar")      
        boton.clicked.connect(btn)
        boton.border_width = 10 
        grid.attach(boton, 0, 0, 2, 1)

        var boton_salir = new Button.with_label ("Salir")
        boton_salir.clicked.connect(btn_salir)
        boton_salir.border_width = 10   
        grid.attach(boton_salir, 2, 0, 2, 1)

        window.show_all()       

    def btn(btn:Button)
        escritorio: Gdk.Window = Gdk.get_default_root_window()
        ancho: int = escritorio.get_width()
        alto: int = escritorio.get_height() 
        screenshot: Gdk.Pixbuf = Gdk.pixbuf_get_from_window(escritorio, 0, 0, ancho, alto)
        try
            screenshot.save("screenshot.png","png")
        except e: GLib.Error
            stderr.printf ("Error: %s\n", e.message)

    def btn_salir(btn:Button)       
        this.quit()

我想把它放在这里是因为 Gtk.Application 和 Genie 的例子很少。

谢谢

于 2017-02-01T17:01:50.377 回答