Jak utworzyć działający wskaźnik za pomocą Qt / C ++?

8

Korzystam z Qt IDE w celu zbudowania aplikacji, aby wziąć udział w konkursie Ubuntu Showdown. W mojej aplikacji wykonałem następujące czynności:

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

Zasadniczo więc próbuję wprowadzić prosty wskaźnik, który po kliknięciu ukryje wskaźnik i wyświetli aplikację. Wskaźnik można z powodzeniem ukryć za pomocą PASYWNEJ funkcji, ale podczas danych połączenia-> pokaż () ;, aplikacja ulega awarii.

Będziemy wdzięczni za wszelką pomoc w tym, co robię źle. Pomóż mi również rozwiązać problem, z którym się zmagam (alternatywnie przejdę do starej i dobrej ikony zasobnika (w każdym razie działa dobrze w 12.04), z którą bardzo łatwo i skutecznie sobie poradzę)

hytromo
źródło
jaki masz błąd?
Hernantz
bezbłędnie, po prostu ulega awarii :)
hytromo
Czy możesz dodać Stacktrace z awarii do swojego pytania? To wskaże dokładną linię, w której aplikacja ulega awarii. Jeśli potrzebujesz pomocy, sprawdź ten link doc.qt.nokia.com/qtcreator-2.3/…
3
Konkluzja: nie mieszaj GTK i Qt w aplikacji C ++. Pętla zdarzeń ma różną strukturę w każdej z nich i nie będziesz miał nic poza kłopotami.
Nathan Osman

Odpowiedzi:

9

Nie powinieneś używać libappindicator do tworzenia wskaźnika aplikacji w programach Qt. Jest lepszy sposób!

Jeśli masz zainstalowany sni-qt , który automatycznie zastąpi instancje QSystemTrayIcon kodem do renderowania tej ikony tacy jako pozycji Powiadomienia o stanie KDE , którą usługa Wskaźnik aplikacji pobierze i wyświetli na pasku menu Ubuntu .

Ted Gould
źródło
Dzięki. Wiem doskonale, jak działa QSystemTrayIcon i, jak widzę, sni-qt jest wstępnie zainstalowany, więc nie będzie mi przykro, jeśli będę go zależał! Zasady powinny być jednak jaśniejsze na temat wskaźnika (zalecają stosowanie wskaźników, podczas gdy w rzeczywistości Qt tworzy ikony na pasku zadań, które są przekształcane w wskaźniki ...). Prawdopodobnie będziesz miał nagrodę, ale muszę poczekać 17 godzin.
hytromo
2
Ten pakiet (sni-qt) jest teraz uszkodzony.
Goddard
2
„Jest lepszy sposób!” Nie z Qt5, nie ma.
Nathan Osman
-1

Powiedziałbym, że próbujesz przekazać tutaj wskaźnik „ten” jako wskaźnik podobny do „* this”

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

do

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);
Hernantz
źródło
Dzięki, traktuję to jako błąd (nie kompiluje się): błąd: nie można przekonwertować „MainWindow” na „gpointer {aka void *}” dla argumentu „4” na „gulong g_signal_connect_data (gpointer, const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags) '
hytromo