Gtk::Window 在将我的 gtkmm2 移植到 gtkmm3 应用程序时显示并退出
Gtk::Window shows and exits while porting my gtkmm2 to gtkmm3 application
我正在将我的 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;
}
Header:
// 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();
}
}
我正在尝试用状态图标显示我的 window。切换 window 可见性,同时单击状态图标。代码编译得很好,但似乎当我执行二进制文件时,构造函数和析构函数被调用。如果我使用这样的东西:
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm." PACKAGE_ID);
alarm_ui win(app);
app->run (win);
windows 显示,但是...正如预期的那样,在 hide() 命令上退出...有什么想法吗?
hold() 和 release() 是我唯一的选择吗?
默认情况下,Gtk::Application::run() returns 当所有应用程序的 windows 已关闭(隐藏)时。当您的 window (win) 在您的 main() 结束时超出范围时将被销毁。
Gtk::Application::hold() 和 release() 可能正是您所需要的。或者,也许您可以在 运行() returns 之后做任何您需要做的事情。我想这取决于你想做什么和什么时候做。
我正在将我的 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;
}
Header:
// 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();
}
}
我正在尝试用状态图标显示我的 window。切换 window 可见性,同时单击状态图标。代码编译得很好,但似乎当我执行二进制文件时,构造函数和析构函数被调用。如果我使用这样的东西:
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm." PACKAGE_ID);
alarm_ui win(app);
app->run (win);
windows 显示,但是...正如预期的那样,在 hide() 命令上退出...有什么想法吗? hold() 和 release() 是我唯一的选择吗?
默认情况下,Gtk::Application::run() returns 当所有应用程序的 windows 已关闭(隐藏)时。当您的 window (win) 在您的 main() 结束时超出范围时将被销毁。
Gtk::Application::hold() 和 release() 可能正是您所需要的。或者,也许您可以在 运行() returns 之后做任何您需要做的事情。我想这取决于你想做什么和什么时候做。