Come posso creare un indicatore funzionante con Qt / C ++?


8

Sto usando Qt IDE per creare la mia applicazione in modo da partecipare al concorso Ubuntu Showdown. Nella mia domanda, ho fatto quanto segue:

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

Quindi, sostanzialmente sto provando a creare una semplice voce dell'indicatore, che, facendo clic, nasconderà l'indicatore e visualizzerà l'applicazione. L'indicatore può essere nascosto con successo usando l'oggetto PASSIVO laggiù, ma, durante la chiamata dati-> show () ;, l'applicazione si arresta in modo anomalo.

Qualsiasi aiuto su ciò che sto facendo di sbagliato sarebbe apprezzato! Inoltre, ti prego, aiutami a correggere questo problema che sto affrontando (in alternativa, eseguirò la migrazione all'icona del vassoio vecchio e buono (funziona bene in 12.04, comunque) che posso gestire in modo molto semplice ed efficiente)


qual è l'errore che stai riscontrando?
Hernantz,

nessun errore, si blocca e basta :)
hytromo

Puoi per favore aggiungere Stacktrace dal crash alla tua domanda? Ciò indicherà la linea esatta in cui l'app si arresta in modo anomalo. Se hai bisogno di aiuto, dai un'occhiata a questo link doc.qt.nokia.com/qtcreator-2.3/…

3
In conclusione: non mescolare GTK e Qt in un'applicazione C ++. Il ciclo degli eventi è strutturato in modo diverso in ciascuno di essi e non incontrerai altro che problemi.
Nathan Osman,

Risposte:


9

Non dovresti usare libappindicator per creare un Indicatore Applicazione nei programmi Qt. C'è un modo migliore!

Se hai installato sni-qt che sostituirà automagicamente le istanze di QSystemTrayIcon con il codice per il rendering di quell'icona della barra come elemento di notifica dello stato di KDE , che il servizio Indicatore applicazione raccoglierà e mostrerà nella barra dei menu di Ubuntu .


Grazie. So perfettamente come funziona QSystemTrayIcon e, come posso vedere, sni-qt è preinstallato, quindi non mi dispiacerà se ce l'ho come dipendenza! Le regole dovrebbero essere più chiare, tuttavia, sull'aspetto dell'indicatore (raccomandano l'uso di indicatori, mentre, in realtà, Qt crea icone nella barra delle applicazioni che vengono trasformate in indicatori ...). Probabilmente avrai la taglia, ma devo aspettare 17 ore.
hytromo,

2
Questo pacchetto (sni-qt) è ora rotto.
Goddard,

2
"C'è un modo migliore!" Non con Qt5, non c'è.
Nathan Osman,

-1

Direi che provi a passare il puntatore "questo" come un puntatore come "* questo" qui

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

per

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

Grazie, prendo questo come un erro (non si compila): errore: impossibile convertire "MainWindow" in "gpointer {aka void *}" per l'argomento "4" in "gulong g_signal_connect_data (gpointer, const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags) '
hytromo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.