学习Gtkmm系列之五
来源:互联网 发布:淘宝达人帖子范文 编辑:程序博客网 时间:2024/06/11 11:03
程序客户区的创建可谓仁者见仁,智者见智了。比较常用的就是使用hpaned控件来完成,左边为sidepane,右边位mainpane,这样将来可以根据实际应用的需要来采用不同的控件。我这里使用两个Button来演示。该控件采用属性来与菜单中的选项的使能状态一一对应。由于不太熟悉gtkmm,其资料也比较少,用了点时间来研究属性的用法(gtkmm源码都是对gtk的封装,不太适合)。
头文件代码如下:(特别注意构造函数的用法)
class ClientRoot : public Gtk::HPaned { public: ClientRoot(); virtual ~ClientRoot(); Glib::PropertyProxy<bool> property_can_save(); Glib::PropertyProxy<bool> property_can_save_as(); Glib::PropertyProxy<bool> property_can_undo(); Glib::PropertyProxy<bool> property_can_redo(); Glib::PropertyProxy<bool> property_can_cut(); Glib::PropertyProxy<bool> property_can_copy(); Glib::PropertyProxy<bool> property_can_paste(); Glib::PropertyProxy<bool> property_can_delete(); Glib::PropertyProxy<bool> property_can_select_all(); protected: void onTestProperties(); private: Glib::Property<bool> prop_can_save; Glib::Property<bool> prop_can_save_as; Glib::Property<bool> prop_can_undo; Glib::Property<bool> prop_can_redo; Glib::Property<bool> prop_can_cut; Glib::Property<bool> prop_can_copy; Glib::Property<bool> prop_can_paste; Glib::Property<bool> prop_can_delete; Glib::Property<bool> prop_can_select_all; Gtk::Button m_SidePane; Gtk::Button m_MainPane;};实现文件关键代码如下:
ClientRoot::ClientRoot() : Glib::ObjectBase (typeid (ClientRoot)), prop_can_save(*this, "can-save"), prop_can_save_as(*this, "can-save-as"), prop_can_undo(*this, "can-undo"), prop_can_redo(*this, "can-redo"), prop_can_cut(*this, "can-cut"), prop_can_copy(*this, "can-copy"), prop_can_paste(*this, "can-paste"), prop_can_delete(*this, "can-delete"), prop_can_select_all(*this, "can-select-all"), m_SidePane("SidePane"), m_MainPane("MainPane"){ pack1(m_SidePane, true, false); pack2(m_MainPane, true, false); m_MainPane.signal_clicked().connect(sigc::mem_fun(*this, &ClientRoot::onTestProperties));} void ClientRoot::onTestProperties(){ static bool sState = false; sState = ! sState; prop_can_save = sState; prop_can_save_as = sState; prop_can_undo = sState; prop_can_redo = sState; prop_can_cut = sState; prop_can_copy = sState; prop_can_paste = sState; prop_can_delete = sState; prop_can_select_all = sState;} Glib::PropertyProxy<bool>ClientRoot::property_can_save(){ return prop_can_save.get_proxy();}Glib::PropertyProxy<bool>ClientRoot::property_can_save_as(){ return prop_can_save_as.get_proxy();}...
信号连接方法如下:
m_ClientRoot.property_can_save().signal_changed().connect( sigc::mem_fun(*this, &SampleWindow::onCanSaveChanged)); m_ClientRoot.property_can_save_as().signal_changed().connect( sigc::mem_fun(*this, &SampleWindow::onCanSaveAsChanged)); m_ClientRoot.property_can_undo().signal_changed().connect( sigc::mem_fun(*this, &SampleWindow::onCanUndoChanged)); m_ClientRoot.property_can_redo().signal_changed().connect( sigc::mem_fun(*this, &SampleWindow::onCanRedoChanged)); m_ClientRoot.property_can_cut().signal_changed().connect( sigc::mem_fun(*this, &SampleWindow::onCanCutChanged)); m_ClientRoot.property_can_copy().signal_changed().connect( sigc::mem_fun(*this, &SampleWindow::onCanCopyChanged)); m_ClientRoot.property_can_paste().signal_changed().connect( sigc::mem_fun(*this, &SampleWindow::onCanPasteChanged)); m_ClientRoot.property_can_delete().signal_changed().connect( sigc::mem_fun(*this, &SampleWindow::onCanDeleteChanged)); m_ClientRoot.property_can_select_all().signal_changed().connect( sigc::mem_fun(*this, &SampleWindow::onCanSelectAllChanged));回调函数只是简单的更改action的sensitivity,如下:
void SampleWindow::onCanSaveChanged(){ Glib::RefPtr<Gtk::Action> action = m_refNormalActionGroup->get_action("FileSave"); g_assert(action != 0); action->set_sensitive(m_ClientRoot.property_can_save().get_value());}
效果图如下
- 学习Gtkmm系列之五
- 学习Gtkmm系列之二
- 学习Gtkmm系列之三
- 学习Gtkmm系列之四
- 学习Gtkmm系列之六
- 学习Gtkmm系列之七
- 学习Gtkmm系列之一
- ajax学习系列之五: 操纵 DOM
- android Fragment系列学习笔记之五
- C++11系列学习之五-------decltype
- quick-cocos2d-x 学习系列之五 ccsloader学习
- Deep Learning(深度学习)学习系列之(五)
- SCCM2012系列之五
- JAVA/JSP学习系列之五(JDBC-ODBC翻页例子)
- JAVA/JSP学习系列之五(JDBC-ODBC翻页例子)
- JAVA/JSP学习系列之五(JDBC-ODBC翻页例子)
- Linq to Sql 学习系列之五 存储过程
- WPF控件学习系列之五---CanvasPanel控件
- 一键无线共享
- stl map用法和make_pair函数
- 命令(command)模式
- jQuery 入门教程(36): jQuery UI Menu 示例
- 基于stm32f103zet6的FAT16文件系统学习3(初步分析ff9a)
- 学习Gtkmm系列之五
- jQuery 选择器
- 结构体和类
- Codeforces Round #173 (Div. 2) A.Bit++
- 我的架构师成长之路
- centos 下安装g++
- 2013年3月工作小结 -- 热烈庆祝ECM系统成功升级到V2.0
- Ftp服务器架设与客户端使用--FileZilla
- C语言第四堂课作业