¿Cómo creo un indicador de trabajo con Qt / C ++?

8

Estoy usando Qt IDE para construir mi aplicación y participar en el concurso Ubuntu Showdown. En mi aplicación, hice lo siguiente:

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

Entonces, básicamente estoy tratando de hacer una entrada de indicador simple, que, al hacer clic, ocultará el indicador y mostrará la aplicación. El indicador se puede ocultar con éxito usando la cosa PASIVA allí, pero, durante la llamada de datos-> show () ;, la aplicación se bloquea.

¡Cualquier ayuda sobre lo que estoy haciendo mal sería apreciada! Además, ayúdenme a corregir este problema que estoy enfrentando (alternativamente, migraré al icono de bandeja antiguo y bueno (de todos modos funciona bien en 12.04) que puedo manejar de manera muy fácil y eficiente)

hytromo
fuente
¿Cuál es el error que estás recibiendo?
Hernantz 01 de
no hay error, simplemente se bloquea :)
hytromo 01 de
¿Puedes agregar el Stacktrace del accidente a tu pregunta? Eso señalará la línea exacta en la que su aplicación se bloquea. Si necesita ayuda con eso, consulte este enlace doc.qt.nokia.com/qtcreator-2.3/…
3
En pocas palabras: no mezcle GTK y Qt en una aplicación C ++. El ciclo de eventos está estructurado de manera diferente en cada uno y no tendrá más que problemas.
Nathan Osman

Respuestas:

9

No debe usar libappindicator para crear un indicador de aplicación en programas Qt. ¡Hay una mejor manera!

Si tiene instalado sni -qt, esto reemplazará automáticamente las instancias de QSystemTrayIcon con el código para representar ese icono de la bandeja como un elemento de notificación de estado de KDE , que el servicio Indicador de aplicación recogerá y mostrará en la barra de menú de Ubuntu .

Ted Gould
fuente
Gracias. Sé perfectamente cómo funciona QSystemTrayIcon y, como puedo ver, sni-qt está preinstalado, ¡así que no me arrepentiré si lo tengo como una dependencia! Sin embargo, las reglas deberían ser más claras sobre el indicador (recomiendan el uso de indicadores, mientras que, de hecho, Qt crea iconos de bandeja que se están transformando en indicadores ...). Probablemente tendrás la recompensa, pero tengo que esperar 17 horas.
hytromo
2
Este paquete (sni-qt) ahora está roto.
Goddard
2
"¡Hay una mejor manera!" No con Qt5, no lo hay.
Nathan Osman
-1

Diría que intentas pasar el puntero "this" como un puntero como "* this" aquí

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

a

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);
Hernantz
fuente
Gracias, tomo esto como un error (no se compila): error: no se puede convertir 'MainWindow' a 'gpointer {aka void *}' para el argumento '4' a 'gulong g_signal_connect_data (gpointer, const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags) '
hytromo