2015-04-05 13 views
0

我移植我gtkmm2到gtkmm3应用程序,这是我到目前为止有:的Gtk ::窗口显示和退出,而我移植到gtkmm2应用gtkmm3

// The main.cxx: 
#include "alarmui.hxx" 

int main (int argc, char *argv[]) { 
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm." PACKAGE_ID); 
    alarm_ui win(app); 
    app->run(); 
    return 0; 
} 

页眉:

// The alarmui.hxx 
#ifndef ALARMUI_HXX_INC 
#define ALARMUI_HXX_INC 

#ifdef HAVE_CONFIG_H 
#include "config.h" 
#endif 

#include <gtkmm/application.h> 
#include <gtkmm/window.h> 
#include <gtkmm/statusicon.h> 
#include <iostream> 
#include <memory> 
#include <functional> 

class alarm_ui : public Gtk::Window 
{ 
    private: 
     Glib::RefPtr<Gtk::Application> _refApp; 
     Glib::RefPtr<Gtk::StatusIcon> m_status_icon; 
    public: 
     alarm_ui (Glib::RefPtr<Gtk::Application>&); 
     virtual ~alarm_ui(); 
    protected: 
     virtual bool delete_event (GdkEventAny*); 
     void status_icon_activate_cb(); 
}; 

#endif 

源代码:

#include "alarmui.hxx" 

alarm_ui::alarm_ui (Glib::RefPtr<Gtk::Application>& refApp) : _refApp(refApp) 
{ 
    std::cout << "init" << std::endl; 
    set_icon_from_file (ICON_PNG_PATH); 
    m_status_icon = Gtk::StatusIcon::create_from_file (ICON_PNG_PATH); 
    m_status_icon->signal_activate().connect (std::bind(&alarm_ui::status_icon_activate_cb, this)); 
    show_all(); 
} 

alarm_ui::~alarm_ui() { 
    std::cout << "done" << std::endl; 
} 

bool alarm_ui::delete_event (GdkEventAny* event) { 
    return false; 
} 

void alarm_ui::status_icon_activate_cb() { 
    if (get_visible()) { 
     iconify(); 
     hide(); 
    } else { 
     deiconify(); 
     show(); 
    } 
} 

我想表明我的一个状态图标窗口。切换窗口的可见性,同时点击状态图标。代码编译好,但似乎当我执行二进制的构造函数和析构函数被调用。如果我用的是这样的:

Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm." PACKAGE_ID); 
    alarm_ui win(app); 
    app->run (win); 

窗户节目,但是...如预期,退出上的hide()命令...任何想法? 是否只有()和释放()我唯一的选择?

回答

1

默认情况下,当所有应用程序的窗口已关闭(隐藏)时,Gtk :: Application :: run()会返回。当你的main()结束时,你的窗口(win)会在它超出范围时被销毁。

Gtk :: Application :: hold()和release()可能确实是你需要的。或者,也许你可以在run()返回后做任何你需要做的事情。我想这取决于你想要做什么以及什么时候做什么。

+0

是的,似乎在构造函数上使用hold()和在析构函数上使用realease()或quit()。 – Joel 2015-04-11 00:59:32