Comment créer un indicateur de travail avec Qt / C ++?

8

J'utilise Qt IDE afin de construire mon application afin de participer au concours Ubuntu Showdown. Dans ma candidature, j'ai fait ce qui suit:

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

Donc, fondamentalement, j'essaie de faire une entrée d'indicateur simple, qui, au clic, masquera l'indicateur et affichera l'application. L'indicateur peut être masqué avec succès en utilisant le truc PASSIF là-bas, mais, pendant les données d'appel-> show () ;, l'application se bloque.

Toute aide sur ce que je fais mal serait appréciée! Aussi, veuillez m'aider à corriger ce problème auquel je suis confronté (alternativement, je migrerai vers l'ancienne et bonne icône de la barre d'état (cela fonctionne très bien en 12.04, de toute façon) que je peux gérer très facilement et efficacement)

hytromo
la source
Quelle est l'erreur que vous obtenez?
Hernantz
pas d'erreur, ça plante juste :)
hytromo
Pouvez-vous ajouter la Stacktrace du crash à votre question? Cela indiquera la ligne exacte à laquelle votre application se bloque. Si vous avez besoin d'aide à ce sujet, consultez ce lien doc.qt.nokia.com/qtcreator-2.3/…
3
Conclusion: ne mélangez pas GTK et Qt dans une application C ++. La boucle d'événements est structurée différemment dans chacun et vous ne rencontrerez que des ennuis.
Nathan Osman

Réponses:

9

Vous ne devez pas utiliser libappindicator pour créer un indicateur d'application dans les programmes Qt. Il y a une meilleure façon!

Si vous avez installé sni -qt qui remplacera automatiquement les instances QSystemTrayIcon par le code de rendu de l'icône de la barre d'état en tant qu'élément de notification d' état KDE , que le service Indicateur d'application récupérera et affichera dans la barre de menus Ubuntu .

Ted Gould
la source
Merci. Je sais parfaitement comment QSystemTrayIcon fonctionne et, comme je peux le voir, sni-qt est préinstallé, donc je ne serai pas désolé si je l'ai comme dépendance! Les règles devraient être plus claires, cependant, sur le truc des indicateurs (ils recommandent l'utilisation d'indicateurs, alors qu'en fait, Qt crée des icônes de plateau qui se transforment en indicateurs ...). Vous aurez probablement la prime, mais je dois attendre 17 heures.
hytromo
2
Ce paquet (sni-qt) est maintenant cassé.
Goddard
2
"Il y a une meilleure façon!" Pas avec Qt5, il n'y en a pas.
Nathan Osman
-1

Je dirais que vous essayez de passer le pointeur "this" comme un pointeur comme "* this" ici

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

à

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);
Hernantz
la source
Merci, je prends ceci comme une erreur (il ne compile pas): erreur: ne peut pas convertir 'MainWindow' en 'gpointer {aka void *}' pour l'argument '4' en 'gulong g_signal_connect_data (gpointer, const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags) '
hytromo