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


8

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));
}

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

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


発生しているエラーは何ですか?
Hernantz、2012

エラーなし、それだけでクラッシュします:)
hytromo 2012

クラッシュのスタックトレースを質問に追加できますか?これは、アプリがクラッシュする正確な行を示します。それに関するヘルプが必要な場合は、このリンクdoc.qt.nokia.com/qtcreator-2.3/…を

3
結論:C ++アプリケーションでGTKとQtを混在させないでください。イベントループの構造はそれぞれ異なり、問題が発生するだけです。
Nathan Osman

回答:


9

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

あなたが持っている場合はSNIを-qtのは、それが自動的に置き換えられますインストールQSystemTrayIconのように、そのトレイアイコンをレンダリングするためのコードでインスタンスをKDE項目Notifierのステータスアプリケーションインジケータでサービスをピックアップし、ショーUbuntuのメニューバー


ありがとう。QSystemTrayIconがどのように機能するかを完全に知っています。また、ご覧のように、sni-qtがプリインストールされているので、依存関係があっても後悔しません!ただし、インディケーターについてはルールがより明確になるはずです(インディケーターの使用が推奨されていますが、実際にはQtがインディケーターに変換されるトレイアイコンを作成しています...)。あなたはおそらく賞金を手にするでしょうが、私は17時間待たなければなりません。
hytromo 2012

2
このパッケージ(sni-qt)は現在壊れています。
Goddard

2
「もっと良い方法があります!」Qt5ではありません。
Nathan Osman

-1

「this」ポインタを「* this」のようなポインタとしてここで渡してみてください

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), this);

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);

おかげで、私はこれをエラー(コンパイルされない)と見なしています:エラー:引数 '4'の 'MainWindow'を 'gpointer {aka void *}'から 'gulong g_signal_connect_data(gpointer、const gchar *、GCallback、 gpointer、GClosureNotify、GConnectFlags) '
hytromo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.