【问题标题】:Gtk::Window shows and exits while porting my gtkmm2 to gtkmm3 application将我的 gtkmm2 移植到 gtkmm3 应用程序时 Gtk::Window 显示并退出
【发布时间】:2015-04-11 00:30:09
【问题描述】:

我正在将我的 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() 命令上退出...有什么想法吗? hold() 和 release() 是我唯一的选择吗?

【问题讨论】:

    标签: c++ gtk3 gtkmm


    【解决方案1】:

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

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

    【讨论】:

    • 是的,似乎在构造函数上使用了 hold(),在析构函数上使用了 realease() 或 quit()。
    猜你喜欢
    • 2012-05-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多