注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

GTK编程实现类似firefox的tab控件(C++代码,GtkNotebook控件自定义标签)  

2009-12-02 18:08:07|  分类: linux相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

使用GtkNotebook 这个控件就可以了。 GtkNotebook  可以用来管理多页窗体,而且他的label标签支持把任何Widget 控件,所以只要自己用几个图标和按钮组成一个Widget,然后赋值给 GtkNotebook  的 label标签就可以了,就可以在标签上显示图形和按钮等了。这点比windows下面的简单多了。如果windows下面要编程自己绘制很麻烦的。

运行效果如图:
GTK编程实现类似firefox的tab控件(C++代码,GtkNotebook控件自定义标签) - widebright - widebright的个人空间


代码如下:
#include <gtkmm.h>
#include <gtkmm/main.h>

#include <gtkmm/window.h>
#include <gtkmm/notebook.h>
#include <gtkmm/box.h>
#include <gtkmm/image.h>
#include <gtkmm/button.h>
#include <gtkmm/stockid.h>
#include <gtkmm/stock.h>
#include <gtkmm/enums.h>

//////////////////////////////////////////////////////////////////////////////////////////

class WidebrightTab : public Gtk::Notebook
{

public:
  WidebrightTab();
  virtual ~WidebrightTab();

  void new_tab(Gtk::Widget& child, const Glib::ustring& tab_label);

protected:

  //Signal handlers:
  virtual void  close_tab( Gtk::Widget & child);

  //Member widgets:
  //Gtk::Button m_button;
};

void WidebrightTab::new_tab(Gtk::Widget& child, const Glib::ustring& tab_label)
{
  Gtk::HBox * p_hbox = new Gtk::HBox();
  Gtk::Image * p_image = new Gtk::Image( Gtk::StockID(Gtk::Stock::APPLY),Gtk::ICON_SIZE_LARGE_TOOLBAR );
  Gtk::Label * p_label = new Gtk::Label(tab_label);
  Gtk::Button * p_close_button = new Gtk::Button();
 
  //这里是把 p_hbox 传骨干哦去还是把 child传过去好呢,hbox,image 这些要释放到吧
  p_close_button->signal_pressed().connect(
              sigc::bind<Gtk::Widget &>( sigc::mem_fun(*this, &WidebrightTab::close_tab), child));


  Gtk::Image * p_image_close = new Gtk::Image( Gtk::StockID (Gtk::Stock::CLOSE),
                                 Gtk::ICON_SIZE_MENU); 

  p_close_button->set_relief(Gtk::RELIEF_NONE);
  p_close_button->set_image(* p_image_close);

  p_hbox->set_size_request(150,30);
  p_hbox->pack_start(*p_image,false,false);
  p_hbox->pack_start(*p_label,true,true);
  p_hbox->pack_end(*p_close_button,false,false);
  p_hbox->show_all();
  append_page(child, *p_hbox);
}

void WidebrightTab::close_tab( Gtk::Widget&  child)
{
         //child.hide ();
         Gtk::TextView & textview = (Gtk::TextView &) child;
         Glib::RefPtr< Gtk::TextBuffer> textbuffer = textview.get_buffer ();
         textbuffer->set_text("你点了关闭按钮了!");
         //textview.set_buffer(textbuffer);
         //textview.set_editable (FALSE);
}


WidebrightTab::WidebrightTab()
{
     
}



WidebrightTab::~WidebrightTab()
{
     
}


/////////////////////////////////////////////////////////////////////////////////////////////
class DemoWindow : public Gtk::Window
{
public:
  DemoWindow();
  virtual ~DemoWindow();

protected:


  //Signal handlers:


  //Member widgets:
  WidebrightTab m_Notebook;
  Gtk::HBox m_HBox;

  Gtk::TextView m_TextView1, m_TextView2;
  Glib::RefPtr<Gtk::TextBuffer> m_refTextBuffer1, m_refTextBuffer2;


  std::string title;
};


DemoWindow::DemoWindow()
{

  set_title("Widebright 的Notebook 例子");
  add(m_HBox);

  m_refTextBuffer1 = Gtk::TextBuffer::create();
  m_refTextBuffer1->set_text("这是第一页.");

  m_refTextBuffer2 = Gtk::TextBuffer::create();
  m_refTextBuffer2->set_text("这是第二页.");

  m_TextView1.set_buffer(m_refTextBuffer1);
  m_TextView2.set_buffer(m_refTextBuffer2);


  //Notebook:
   m_Notebook.append_page(m_TextView1, "_1哈哈,第1页", true);  //true = use mnemonic.
   m_Notebook.new_tab(m_TextView1, "第2页");
   m_Notebook.new_tab(m_TextView2, "第3页");

  m_HBox.pack_start(m_Notebook);

  set_default_size (600, 400);

  show_all();
}
DemoWindow::~DemoWindow()
{

}


////////////////////////////////////////////////////////////////////////////////////////////////
int main (int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  DemoWindow  widebright;


  //Shows the window and returns when it is closed.
  Gtk::Main::run(widebright);

  return 0;
}

//编译使用这个命令
//g++ `pkg-config --cflags --libs gtkmm-2.4`  widebright.cc -o notebook




参考了:
Python GTK: How to set up gtk.Notebook tab with custom widget
       http://coding.debuntu.org/python-gtk-how-set-gtk.notebook-tab-custom-widget
gtkmm的文档   http://www.gtkmm.org/documentation.shtml



  评论这张
 
阅读(965)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017