Como crio um indicador de funcionamento com Qt / C ++?

8

Estou usando o Qt IDE para criar meu aplicativo e participar do concurso Ubuntu Showdown. No meu aplicativo, eu fiz o seguinte:

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

Então, basicamente, estou tentando fazer uma entrada simples de indicador, que, ao clicar, oculta o indicador e exibe o aplicativo. O indicador pode ser ocultado com êxito usando o passivo lá, mas, durante a chamada data-> show ();, o aplicativo trava.

Qualquer ajuda sobre o que estou fazendo de errado seria apreciada! Além disso, ajude-me a corrigir esse problema que estou enfrentando (como alternativa, migrarei para o ícone antigo e bom da bandeja (que funciona bem na versão 12.04, de qualquer maneira)) que eu possa resolver com muita facilidade e eficiência)

hytromo
fonte
Qual é o erro que você esta tendo?
Hernantz
nenhum erro, ele só trava :)
hytromo
Você pode adicionar o Stacktrace da falha à sua pergunta? Isso indicará a linha exata em que seu aplicativo está travando. Se precisar de ajuda com isso, então confira este link doc.qt.nokia.com/qtcreator-2.3/...
3
Conclusão: não misture GTK e Qt em um aplicativo C ++. O loop de eventos é estruturado de forma diferente em cada um e você terá apenas problemas.
Nathan Osman

Respostas:

9

Você não deve usar o libappindicator para criar um Indicador de Aplicativo nos programas Qt. Existe uma maneira melhor!

Se você tiver o sni-qt instalado, substituirá automaticamente as instâncias QSystemTrayIcon pelo código para renderizar o ícone da bandeja como um Item Notificador de Status do KDE , que o serviço Indicador de Aplicativo selecionará e mostrará na barra de menus do Ubuntu .

Ted Gould
fonte
Obrigado. Sei perfeitamente como o QSystemTrayIcon funciona e, como posso ver, o sni-qt está pré-instalado, portanto, não me arrependo de tê-lo como dependência! As regras devem ser mais claras, no entanto, sobre o indicador (elas recomendam o uso de indicadores, enquanto, de fato, o Qt cria ícones de bandeja que estão sendo transformados em indicadores ...). Você provavelmente terá a recompensa, mas eu tenho que esperar 17 horas.
Htromo 04/07/2012
2
Este pacote (sni-qt) agora está quebrado.
Goddard
2
"Existe uma maneira melhor!" Não com o Qt5, não existe.
Nathan Osman
-1

Eu diria que você tenta passar o ponteiro "this" como um ponteiro como "* this" aqui

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

para

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);
Hernantz
fonte
Obrigado, por considerar isso como um erro (não é compilado): error: não é possível converter 'MainWindow' em 'gpointer {aka void *}' do argumento '4' em 'gulong g_signal_connect_data (gpointer, const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags) '
hytromo 01/07/2012