web-dev-qa-db-ja.com

Qt / C ++で作業インジケーターを作成するにはどうすればよいですか?

Ubuntu Showdownコンテストに参加するために、アプリケーションをビルドするためにQt IDEを使用しています。私のアプリケーションでは、次のことを行いました。

void show_app(MainWindow *data)
{
    //this works fine:
    app_indicator_set_status(appindicator, APP_INDICATOR_STATUS_PASSIVE);
    //this crashes the application:
    data->show();
}


void MainWindow::make_indicator()
{
    if(appindicator){
        //appindicator has already been created
        return;
    }
    appindicator = app_indicator_new("Format Junkie Indicator", "formatjunkie", APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
    GtkWidget* showapp_option;
    GtkWidget* indicatormenu = gtk_menu_new();
    GtkWidget* item = gtk_menu_item_new_with_label("Format Junkie main menu");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), indicatormenu);

    showapp_option = gtk_menu_item_new_with_label("Show App!");
    g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), this);
    gtk_menu_Shell_append(GTK_MENU_Shell(indicatormenu), showapp_option);

    gtk_widget_show_all(indicatormenu);
    app_indicator_set_status(appindicator, APP_INDICATOR_STATUS_ACTIVE);
    app_indicator_set_attention_icon(appindicator, "dialog-warning");

    app_indicator_set_menu(appindicator, GTK_MENU (indicatormenu));
}

したがって、基本的には、単純なインジケーターエントリを作成しようとしています。クリックすると、インジケーターが非表示になり、アプリケーションが表示されます。インジケータは、そこにあるパッシブなものを使用して正常に非表示にすることができますが、呼び出しdata-> show();の間に、アプリケーションがクラッシュします。

私が間違っていることについての助けをいただければ幸いです!また、私が直面しているこの問題を解決するのを手伝ってください(あるいは、非常に簡単かつ効率的に処理できる古い良いトレイアイコン(12.04でうまく動作します)に移行します)

8
hytromo

Qtプログラムでアプリケーションインジケーターを作成するために libappindicator を使用しないでください。もっと良い方法があります!

sni-qt がインストールされている場合、自動的に QSystemTrayIcon インスタンスをそのトレイアイコンを KDE Status Notifier Item としてレンダリングするためのコードに置き換えます アプリケーションインジケータ サービスは、ピックアップして buntuメニューバー に表示されます。

9
Ted Gould