我找不到关于" Gtk.Application"的信息或示例。在Genie。
在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)
答案 0 :(得分:6)
你的例子看起来对我来说是个不错的开始,但我认为你应该添加一个应用程序ID和一些应用程序标记。
三个好的资源是GTK+3 Reference Manual's documentation for GtkApplication,GNOME Wiki“HowDoI”部分的页面名为"Using GtkApplication"和GIO Reference Manual's documentation for GApplication。 Vala绑定中的GApplication或GLib.Application是GtkApplication的父类。
“HowDoI”页面建议:
GtkApplication没有为您实现main()。你必须自己这样做。你的main()函数应该尽可能小,除了创建你的GtkApplication并运行它之外什么都不做。应该始终响应GtkApplication发出的信号完成“实际工作”。
您在Genie中的main()
功能是:
init
new MyApplication().run( args )
这就像你能得到的一样简单。
“HowDoI”页面也建议:
当您的应用程序启动时,将触发启动信号。这使您有机会执行与显示新窗口无直接关系的初始化任务。在此之后,根据应用程序的启动方式,将激活或打开下一个。
你没有用你的例子做任何启动任务,这很好。因此,无需使用startup
信号,但您通过使用activate
覆盖虚函数来使用def override activate ()
信号。当Gtk.Application运行时,activate
实际上是默认信号,但是在设置了适当的ApplicatonFlags
时可以发出替代信号。例如,如果设置了HANDLES_OPEN
标志,那么如果存在未解析的命令行参数,则将发送open
信号。未解析的参数被视为文件名或URI。默认标志为FLAGS_NONE
,稍后将在示例代码中明确显示。
GTK + 3参考手册关于GtkApplication的部分说明:
目前,GtkApplication处理GTK +初始化,应用程序唯一性,会话管理,通过导出操作和菜单提供一些基本的脚本化和桌面shell集成,并管理一个顶级窗口列表,其生命周期自动与您的生命周期相关联application ...如果没有给出应用程序ID,那么将禁用某些功能(最明显的是应用程序唯一性)。只有GTK + 3.6或更高版本才允许使用null应用程序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
显式。
答案 1 :(得分:4)
好吧,我还在取得进展。
我用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的例子。
谢谢