文章目录
- 基础
- 解析 Chapter 7. Range Widgets
- 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 类相同
- 内存管理
- 类内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被销毁时,按钮也将被删除。不再需要删除pButton 来释放按钮的内存;它的删除已委托给该 MyContainer对象。MyContainer::MyContainer() {auto pButton = Gtk::make_managed<Gtk::Button>("Test");append(*pButton); //add *pButton to MyContainer }
- 类内widget:
解析 Chapter 7. Range Widgets
-
https://gnome.pages.gitlab.gnome.org/gtkmm-documentation/sec-range-example.html
-
容器大纲:
- 这些容器的第二个参数是其所包含的每个子辈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); //设置值精度
事件触发函数回调写法如上;