Wie erstelle ich mit Qt / C ++ einen Arbeitsindikator?

8

Ich verwende Qt IDE, um meine Anwendung zu erstellen und am Ubuntu Showdown-Wettbewerb teilzunehmen. In meiner Bewerbung habe ich Folgendes getan:

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

Im Grunde versuche ich also, einen einfachen Indikatoreintrag zu erstellen, der beim Klicken den Indikator ausblendet und die Anwendung anzeigt. Der Indikator kann mit dem PASSIVE-Ding dort erfolgreich ausgeblendet werden, aber während des Aufrufs data-> show (); stürzt die Anwendung ab.

Jede Hilfe bei dem, was ich falsch mache, wäre dankbar! Bitte helfen Sie mir auch, dieses Problem zu beheben (alternativ werde ich auf das alte und gute Tray-Symbol migrieren (es funktioniert ohnehin in 12.04 einwandfrei), das ich sehr einfach und effizient behandeln kann).

Hytromo
quelle
Was ist der Fehler, den Sie bekommen?
Hernantz
Kein Fehler, es stürzt nur ab :)
Hytromo
Können Sie bitte den Stacktrace aus dem Absturz zu Ihrer Frage hinzufügen? Das zeigt die genaue Linie an, an der Ihre App abstürzt. Wenn Sie dabei Hilfe benötigen, überprüfen Sie diesen Link doc.qt.nokia.com/qtcreator-2.3/…
3
Fazit: Sie nicht mischen GTK und Qt in einer C ++ Anwendung. Die Ereignisschleife ist jeweils unterschiedlich strukturiert, und Sie werden nur auf Probleme stoßen.
Nathan Osman

Antworten:

9

Sie sollten libappindicator nicht zum Erstellen eines Anwendungsindikators in Qt-Programmen verwenden. Es gibt einen besseren Weg!

Wenn Sie sni-qt installiert haben, werden QSystemTrayIcon- Instanzen automatisch durch den Code zum Rendern dieses Taskleistensymbols als KDE-Statusbenachrichtigungselement ersetzt , das der Anwendungsindikatordienst aufnimmt und in der Ubuntu-Menüleiste anzeigt .

Ted Gould
quelle
Vielen Dank. Ich weiß genau, wie das QSystemTrayIcon funktioniert, und wie ich sehen kann, ist sni-qt vorinstalliert, sodass es mir nicht leid tut, wenn ich es als Abhängigkeit habe! Die Regeln für das Indikator-Ding sollten jedoch klarer sein (sie empfehlen die Verwendung von Indikatoren, während Qt tatsächlich Tray-Symbole erstellt, die in Indikatoren umgewandelt werden ...). Sie werden wahrscheinlich das Kopfgeld haben, aber ich muss 17 Stunden warten.
Hytromo
2
Dieses Paket (sni-qt) ist jetzt kaputt.
Goddard
2
"Es gibt einen besseren Weg!" Nicht mit Qt5, gibt es nicht.
Nathan Osman
-1

Ich würde sagen, Sie versuchen, den Zeiger "this" als Zeiger wie "* this" hier zu übergeben

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

zu

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);
Hernantz
quelle
Danke, ich nehme das als Fehler (es wird nicht kompiliert): Fehler: 'MainWindow' kann nicht in 'gpointer {aka void *}' für Argument '4' in 'gulong g_signal_connect_data (gpointer, const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags) '
hytromo