2015-04-05 11 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