设为首页收藏本站
查看: 3965|回复: 1

[高级语言] [gtkmm] 02 Hello,World && 上个帖子例子讲解

[复制链接]
  • TA的每日心情
    难过
    2022-9-23 12:52
  • 签到天数: 201 天

    [LV.7]常住居民III

    发表于 2021-11-13 11:43:19 | 显示全部楼层 |阅读模式


    我们先来讲一下上个帖子留下来的那个例子

    1. #include <gtkmm.h>
    复制代码

    所有的 gtkmm 程序都需要包含一些特定的 gtkmm 头文件;gtkmm.h 包含了所有 gtkmm 的内容。通常来说,这并不是一个好主意,因为它包括了一兆左右的头文件。当然,对于这个简单的程序,这就够了。
    下一条语句:
    1. auto app = Gtk::Application::create("org.gtkmm.examples.base");
    复制代码

    创建一个Gtk::Application对象,将其储存在一个Glib::RefPtr智能指针中。所有的gtkmm应用都需要如此做。该对象的create()方法将初始化gtkmm。

    接下来的两行代码创建一个窗口并设置其的初始大小:
    1. Gtk::Window window;
    2. window.set_default_size(200, 200);
    复制代码

    最后一行显示窗口并进入gtkmm主循环,当窗口被关闭。你的main()函数将会返回成功或者适当的错误码。

    1. return app->run(window, argc, argv);
    复制代码




    根据计算机科学的传统,我们现在以 gtkmm 的方式来写一个 Hello World 程序
    同样的,让我先把这个程序的代码给你,再去讲解它
    1. #include <gtkmm.h>
    2. #include <iostream>
    3. class HelloWorld : public Gtk::Window
    4. {

    5. public:
    6.         HelloWorld();
    7.         ~HelloWorld() override;

    8. protected:
    9.         //Signal handlers:
    10.         void on_button_clicked();

    11.         //Member widgets:
    12.         Gtk::Button m_button;
    13. };

    14. HelloWorld::HelloWorld()
    15.         : m_button("Hello World")   // creates a new button with label "Hello World".
    16. {
    17.         // Sets the margin around the button.
    18.         m_button.set_margin(10);

    19.         // When the button receives the "clicked" signal, it will call the
    20.         // on_button_clicked() method defined below.
    21.         m_button.signal_clicked().connect(sigc::mem_fun(*this,
    22.                 &HelloWorld::on_button_clicked));

    23.         // This packs the button into the Window (a container).
    24.         set_child(m_button);
    25. }

    26. HelloWorld::~HelloWorld()
    27. {
    28. }

    29. void HelloWorld::on_button_clicked()
    30. {
    31.         std::cout << "Hello World" << std::endl;
    32. }

    33. int main(int argc, char* argv[])
    34. {
    35.         auto app = Gtk::Application::create("org.gtkmm.example");

    36.         //Shows the window and returns when it is closed.
    37.         return app->make_window_and_run<HelloWorld>(argc, argv);
    38. }
    复制代码


    在继续讲解之前,可以尝试着编译并运行这个程序,你会极其兴奋的看到这样的结果:







    好耶,运行成功



    真让人激动,不是吗?让我们回过头来看一下代码。首先看一下 HelloWorld 类:

    1. class HelloWorld : public Gtk::Window
    2. {
    3. public:
    4.   HelloWorld();
    5.   ~HelloWorld() override;

    6. protected:
    7.   //Signal handlers:
    8.   void on_button_clicked();

    9.   //Member widgets:
    10.   Gtk::Button m_button;
    11. };
    复制代码


    这个类实现了“Hello World”窗口。它由 Gtk::Window 派生,并且只有一个 Gtk::Button 成员。我们已经使用构造函数为该窗口完成了所有的初始化工作,包括挂接消息。




    再看一下这个类的构造函数

    1. HelloWorld::HelloWorld()
    2. : m_button("Hello World")
    3. {
    4.   m_button.set_margin(10);
    5.   m_button.signal_clicked().connect(sigc::mem_fun(*this,
    6.     &HelloWorld::on_button_clicked));
    7.   set_child(m_button);
    8. }
    复制代码


    注意,我们使用初始化列表的方式给 m_button 对象添加了一个“Hello World”的标签。

    接下来调用 Button 类的 set_margin() 方法。这将设置按钮周围空间的大小。

    然后,把 m_button 的 clicked 信号挂接到信号处理函数上。这会向 stdout (标准输出) 打印出友好的问候语。

    接下来调用 Windows 类的 set_child() 方法将m_button放入窗口。set_child()方法会将部件放入窗口中。




    最后看main函数

    1. int main(int argc, char* argv[])
    2. {
    3.   auto app = Gtk::Application::create("org.gtkmm.example");
    4.   HelloWorld helloworld;
    5.   return app->run(helloworld, argc, argv);
    6. }
    复制代码


    我们首先实例化一个储存在名为 app 的RefPtr智能指针对象,它的类型为 Gtk::Application 。每一个 gtkmm 程序都有这样的一个东西。

    接着我们创建了 HelloWorld 类的对象,它的构造函数没有参数,当然,它现在还不是可视的。当我们调用Gtk::Application::run()并给它提供一个 helloworld 窗口和命令行参数时,它将显示这个窗口并进入 gtkmm消息循环。在消息循环中,gtkmm 是空闲的,它等待用户的操作并作出相应的反应。当用户关闭窗口时,run() 函数将返回,导致main()函数的最后一行将被执行。然后程序就结束了。

    就像我们之前显示的简单示例一样,这个 Hello World 程序不使用命令行参数。不需要将其传递给run()。




    下个帖子让我们来了解gtkbutton这个控件的详细使用方法

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x

    评分

    2

    查看全部评分

  • TA的每日心情
    难过
    2022-9-23 12:52
  • 签到天数: 201 天

    [LV.7]常住居民III

     楼主| 发表于 2021-11-13 11:45:04 | 显示全部楼层
    就像上个帖子所说的那样,这个帖子中给出的代码同样可以在其他平台被编译并正常运行
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    红盟社区--红客联盟 

    Processed in 0.062862 second(s), 25 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    备案号:冀ICP备20006029号-1 Powered by HUC © 2001-2021 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表