Start gtkmm 4 Programming (range controls)_

  • https://gtkmm.org/en/documentation.html
  • https://gnome.pages.gitlab.gnome.org/gtkmm-documentation/index.html

基础

  • 容器:
    • 容器小部件与其他小部件一样,派生自Gtk::Widget.例如Gtk::Grid可以容纳许多子小部件,因此这些小部件通常具有更复杂的接口。其他的,例如 Gtk::Frame只包含一个子部件。
    • 从技术上讲Gtk::Button,它们Gtk::Window是单项容器,
    • 大多数单项容器小部件都具有set_child() 用于unset_child()子小部件的方法, 多项容器则是append(), attach() (用于Gtk::Grid)
    • 如果区域内超过一个widget 就可以用容器box来包含他们, 这能更好的排版
  • GTK::ustring
    • 用法几乎与C++中的 string 类相同
  • Glib::RefPtr<>
    • 类似C++中的 shared 智能指针
  • 内存管理
    • 类内widget:
      #include <gtkmm/button.h>
      #include <gtkmm/window.h>
      class Foo : public Gtk::Window
      {
      private:
        Gtk::Button theButton;
        // will be destroyed when the Foo object is destroyed
      };
      
    • Dynamic allocation with make_managed() and append()
      MyContainer::MyContainer()
      {
          auto pButton = Gtk::make_managed<Gtk::Button>("Test");
          append(*pButton); //add *pButton to MyContainer
      }
      
      当类型对象MyContainer被销毁时,按钮也将被删除。不再需要删除pButton 来释放按钮的内存;它的删除已委托给该 MyContainer对象。

解析 Chapter 7. Range Widgets

  • https://gnome.pages.gitlab.gnome.org/gtkmm-documentation/sec-range-example.html

  • 容器大纲:
    image

    • 这些容器的第二个参数是其所包含的每个子辈widget之间的间隔(不影响孙辈)
  • 控件滑块(slider) 在gtkmm里 定义为 Gtk::Scale
    布局第一行有两个 Gtk::Scale 和一个 Gtk::Scrollbar
    它们在初始化时传的第一个参数都为 m_adjustment 是一个 Glib::RefPtr<Gtk::Adjustment> 类型, 这意味着这三个范围widget 滑动一个时会其他两个会同步滑动

  • 剩余两个Gtk::Scale 他们用的是不同的( 都为Glib::RefPtr<Gtk::Adjustment>类型 )实体对象m_adjustment_pagesize和m_adjustment_digits 他们要获取对滑动(滚动)的当前值做一些逻辑处理;

    m_adjustment_pagesize->signal_value_changed().connect(
                sigc::mem_fun(*this,
                &ExampleWindow::on_adjustment2_value_changed)
    );
    

    比如Page Size 滑块滑动时 要求修改 m_adjustment 的 page size和 page 增量, 这些会直接影响到布局第一行的三个范围控件, 可以自己调调, 看看对应关系 这也与初始化m_adjustment 时设置的值相关

    void ExampleWindow::on_adjustment2_value_changed()
    {
        const double val = m_adjustment_pagesize->get_value();
        m_adjustment->set_page_size(val);
        m_adjustment->set_page_increment(val);
    
        // Note that we don't have to emit the "changed" signal
        // because gtkmm does this for us.
    }
    
  • 其他就是按钮(值显示与否)和DropDown(设置值位置)
    Gtk::Scale 对象本身就自己维护着一个对应值, 也提供了与值有关的方法
    set_value_pos(PositionType); //设置值位置
    set_draw_value(bool); //值显示与否
    set_digits(int); //设置值精度
    事件触发函数回调写法如上;

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值