我们';我将继续我们的旅程,在瓦拉编写hello,world程序,但这次是GTK(4)库。
让';让我们创建两个名为Hello的新文件。瓦拉和梅因。瓦拉。是的,我们的计划是从上一篇文章的结尾继续,然后使用GTK慢慢构建hello,world的工作版本。
打开这个新创建的main。vala和copy编写的代码与我们之前在hello/main中编写的代码相同。瓦拉档案。换句话说,main()方法。
int main(string[]args){string name=';world';var hello=new hello(name);hello.greet();return 0;}
接下来,打开新创建的Hello。vala和copy编写的代码与我们之前在hello/hello中编写的代码相同。瓦拉档案。换句话说,大家好。
公共类Hello{public string name;public Hello(string name){this.name=name;}public void greet(){stdout.printf(";你好,%s\n";,this.name);}
让';让我们通过Gtk扩展这个Hello类。应用类如我们';我们现在正在创建GTK应用程序!此扩展通过:operator完成。
公共课你好:Gtk。应用程序{public string name;public Hello(string name){this.name=name;}public void greet(){stdout.printf(";你好,%s\n";,this.name);}
我们不再需要这个greet()方法,因为我们';We’我们对在窗口(或应用程序)而不是终端中显示hello,world感兴趣!
公共课你好:Gtk。应用程序{public string name;public Hello(string name){this.name=name;}
我们专门创建了name变量,以便在greet()方法中打印它的值。因为我们现在没有greet()方法,所以我没有';我不认为我们现在需要任何与name变量关联的代码。但是,是的,我们确实需要这种公开的方法。那么,让';s有空的public方法供进一步使用。
根据文档,我们需要从这个公共方法调用Object()方法。这个Object()方法接受两个参数——application_id、反向域名表示法中的唯一应用程序id或RDN,以及带有其中一个预定义值和ApplicationFlags的标志。在我们的情况下没有任何价值。总之,你需要输入这样的内容。如果您有GitHub/GitLab帐户,请根据您的偏好更改应用程序id的值。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}
我们';我将在将来讨论这个应用程序的id和标志。现在,您需要输入一些东西,以便GTK正确初始化和运行应用程序。它';它就像一个框架,写下这个和那个,让我们正确地调用!
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}void activate(){}
Gtk中已存在此activate()方法。应用程序,我们实际上需要做的是,使用override关键字重写。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}重写void activate(){}
我想你不会';不要忘记访问修饰符的规则。在这个activate()方法的例子中,我们';我将使用受保护的访问修饰符,如下所示';这就是我们的要求!
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}受保护的覆盖无效激活(){}
这个方法会激活应用程序。同样,您可能会对这段代码感到困惑。但是,这是您需要键入的类似于框架的内容(我知道库,随便什么)!
如果应用程序被激活,我们需要做些什么。显示一个应用程序怎么样?那';这就是你';我们应该使用桌面应用程序,对吗!
在这个activate()方法中,让';让我们创建一个窗口。在GTK中,窗口是小部件。我的意思是,所有图形组件都是小部件,包括菜单、按钮、标签、复选框、列表等等。这些都是GTK中的小部件,GTK对每个小部件都有单独的类!
让';s使用ApplicationWindow类创建窗口小部件。这个ApplicationWindow类接受这个应用程序作为参数,这个参数就是这个类,或者这个类本身就是那个应用程序(记住,我们扩展了Gtk.application,将Hello作为应用程序)。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);}
我们刚刚为应用程序创建了一个窗口。我们现在需要调用。在这个窗口对象上显示()方法,以便在activate()方法执行时实际显示它。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.show();}
这是我们的简单窗口应用程序!在我们继续运行应用程序之前,我们需要在main中做一些小的修改。vala作为当前代码,创建Hello类的实例并运行greet()方法,该方法不再有效。
int main(string[]args){string name=';world';var hello=new hello(name);返回0;}
我们也不需要name变量,也不需要在创建实例时将其作为参数传递。
在这个hello对象上,我们需要打电话。方法来实际运行应用程序实例。此方法接受args作为参数。
这run()方法返回一个整数,我们可以直接返回该整数,而不是返回显式的0。
我从上一篇文章中复制了这个命令,您知道这将根据我们在这些文件中编写的代码将hello,world打印为输出。
这是正确的!但是,我们需要对这个命令再做一次修改,因为我们';我们现在正在使用GTK库。在本例中,我们需要通知Vala编译器在编译程序时使用--pkg标志,后跟库名或gtk4(GTK库的安装名)。把所有这些放在一起,下面是我们需要运行的命令。
运行此命令后,您应该会看到默认的200x200窗口,其标题为应用程序名,例如Hello。但是,这不是我们所说的hello,world节目';你在应用程序中的任何地方都看不到hello,world。
让';让我们打印hello,world而不是hello作为标题。这可以通过更新窗口小部件的属性值来实现。窗口有很多属性,包括title(窗口的标题)、default_width(窗口的默认宽度)、default_height(窗口的默认高度)等等。
我们';我们现在将把hello,world分配给window';s title和300设置为默认宽度和默认高度,以创建尺寸为300x300的窗口。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#height=300;window.default#width=300;window.show()}
这是使用GTK库的hello,world程序的第一个版本。我们可以更进一步,在应用程序';这是窗户。
要在窗口中显示文本,我们需要使用Gtk创建一个标签小部件。标签类,就像我们使用Gtk创建窗口一样。应用程序窗口类。在创建标签小部件时,我们需要传递文本,在我们的例子中是hello,world。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#u height=300;window.default#u width=300;var label=new Gtk.label(";hello,world";);窗show();}
标签已创建。我们现在需要在窗口中添加这个标签,以便在屏幕上显示。我们可以使用window的set_child()方法并将label作为参数传递给它。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#u height=300;window.default#u width=300;var label=new Gtk.label(";hello,world";);窗设置子项(标签);窗show();}
运行此程序应在两个窗口';标题和窗口';s区。
让';让我们更进一步,添加一个按钮,上面会有hello,world文本。要添加按钮小部件,我们需要使用Gtk。按钮类。然后我们需要对创建的按钮使用set_label()方法来设置按钮的标签或文本。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#u height=300;window.default#u width=300;var label=new Gtk.label(";hello,world";);窗设置子项(标签);var按钮=新Gtk。按钮();按钮设置标签(";你好,世界";);窗show();}
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#u height=300;window.default#u width=300;var label=new Gtk.label(";hello,world";);窗设置子项(标签);var按钮=新Gtk。按钮();按钮设置标签(";你好,世界";);窗设置孩子(按钮);窗show();}
让';让我们运行这个程序来确认输出。我们现在应该看到hello,world文本下面的按钮(提示:它将不起作用)。
它没有按预期工作,原因是,窗口只能容纳一个子项或小部件,而我们';我们正在尝试添加两个小部件——标签和按钮。因此,窗口对象持有第一个传递的小部件,而忽略其他小部件。为了解决这个问题,我们需要使用容器小部件作为容器,并容纳我们想要的尽可能多的小部件。然后我们';我将使用set_child()方法将此容器小部件设置为窗口的子窗口。GTK中有很多容器小部件,比如box、table、grid等等。
为了演示的目的,我们';我们将使用Gtk。Grid创建网格容器小部件。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#u height=300;window.default#u width=300;var label=new Gtk.label(";hello,world";);窗设置子项(标签);var按钮=新Gtk。按钮();按钮设置标签(";你好,世界";);窗设置孩子(按钮);var grid=新的Gtk。网格();窗show();}
我们现在可以使用。方法将其他小部件添加或打包到网格容器中。这attach()方法接受五个参数,最后两个是可选的——我们';我们有兴趣添加,从左开始列为位置,从上开始行为位置。最后两个可选参数是以空格形式表示的宽度和高度。1是高度和宽度的默认值(如果未通过)。
为了包装标签,我们';我们要写信了。附加(标签,0,0)。换句话说,我们';我们将把标签小部件打包在从左到右0和从上到右0的位置。是的,栅格的位置几何图形从(0,0)开始。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#u height=300;window.default#u width=300;var label=new Gtk.label(";hello,world";);窗设置子项(标签);var按钮=新Gtk。按钮();按钮设置标签(";你好,世界";);窗设置孩子(按钮);var grid=新的Gtk。网格();网格附加(标签,0,0);窗show();}
对于button,我们';我们要写信了。连接(按钮,0,1)。换句话说,我们';我们将把按钮小部件放在第二行左边0和上面1的位置。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#u height=300;window.default#u width=300;var label=new Gtk.label(";hello,world";);窗设置子项(标签);var按钮=新Gtk。按钮();按钮设置标签(";你好,世界";);窗设置孩子(按钮);var grid=新的Gtk。网格();网格附加(标签,0,0);网格连接(按钮,0,1);窗show();}
最后,让';让我们取消通话。将标签和按钮的_child()设置为';我们将把网格设置为子窗口。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#u height=300;window.default#u width=300;var label=new Gtk.label(";hello,world";);var按钮=新Gtk。按钮();按钮设置标签(";你好,世界";);var grid=新的Gtk。网格();网格附加(标签,0,0);网格连接(按钮,0,1);窗设置子对象(网格);窗show();}
现在,运行这个程序应该显示hello,world三次-标题,文本和in按钮。
这很好!让';当点击按钮时,我们甚至可以在终端上打印hello,world文本!为此,我们需要使用信号的概念。我们';当按钮实际被点击时,我们将捕捉按钮发出的点击信号。捕捉信号是通过。connect()方法。让';让我们分步写。
可以这样理解,当单击按钮时,运行connect()方法中编写的代码。这个connect()方法接受匿名方法。
在这个匿名方法中编写的任何代码都将在单击按钮时执行。就我们而言,我们';我们有兴趣在点击按钮时打印hello,world文本。
让';让我们把这三句话写在问候中。vala程序旁边的按钮相关代码。
公共课你好:Gtk。应用程序{public Hello(){Object(Application#u id:";com.github.chauhankiran.repo";,flags:ApplicationFlags.flags_NONE);}protected override void activate(){var window=new Gtk.ApplicationWindow(this);window.title=";hello,world";window.default#u height=300;window.default#u width=300;var label=new Gtk.label(";hello,world";);var按钮=新Gtk。按钮();按钮设置标签(";你好,世界";);按钮点击。连接(()=>;{stdout.printf(";你好,world\n";);});var grid=新的Gtk。网格();网格附加(标签,0,0);网格连接(按钮,0,1);窗设置子对象(网格);窗show();}
同样,这是一个理想的问候,在GTK的世界计划。写这个更大的hello,world项目的想法是让我们对一些概念一瞥';我们将在应用程序开发中使用。话虽如此,在下一篇文章中,我们';我将通过继续学习更多的概念和技术来编写这个微不足道的玩具应用程序。