gtkmm statusicon在创建后退出

时间:2010-08-23 12:36:10

标签: c++ gtk gtkmm trayicon

我必须创建一个简单的应用程序,在系统托盘中显示一个图标和一个菜单,您可以从中执行某些操作。 问题是statusicon在创建后立即关闭。少了什么东西? 我把睡眠放在一边确保它被创造出来。 3秒内,即使不是我设置的图标,系统托盘中也会出现一些内容。

Init.cc

#include <gtkmm/main.h>
#include "Tray.h"

int main(int argc, char *argv[]) {
    Gtk::Main kit(argc, argv);
    printf("Statuicon starting\n");
    Tray tray;
    printf("Statuicon started\n");
    return 0;
}

Tray.cc

#include "Tray.h"

Tray::Tray() {
    set(Gtk::Stock::OK);

    signal_activate().connect(sigc::mem_fun(*this, &Tray::on_statusicon_activated));
    signal_popup_menu().connect(sigc::mem_fun(*this, &Tray::on_statusicon_popup));

    set_visible(true);

    printf("Statusicon created\n");

    sleep(3);
}

Tray::~Tray() {}

void Tray::on_statusicon_popup(guint button, guint activate_time) {
    printf("popup!");
}

void Tray::on_statusicon_activated() {
    printf("active!");
}

Tray.h

#ifndef GTKMM_TRAY_H
#define GTKMM_TRAY_H
#include <gtkmm.h>
#include <unistd.h>
using namespace std;

class Tray : public Gtk::StatusIcon {
    public:
        Tray();
        ~Tray();

    private:
        virtual void on_statusicon_popup(guint button, guint activate_time);
        virtual void on_statusicon_activated();
};

#endif //GTKMM_TRAY_H

1 个答案:

答案 0 :(得分:3)

您根本没有运行主循环,因此无法处理输入事件,并且在构建托盘后程序退出。你要做的是删除sleep,然后在main()函数中,在返回之前添加以下行:

Gtk::Main::run();

然后,当您希望应用程序退出时(通常是为了响应某种事件),请调用

Gtk::Main::quit();