8

I am using Qt IDE in order to build my application so as to participate to the Ubuntu Showdown contest. In my application, I've done the following:

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

So, basically I am trying to make a simple indicator entry, which, on click, it will hide the indicator and display the application. The indicator can be successfully hidden using the PASSIVE thingy over there, but, during the call data->show();, the application crashes.

Any help on what I am doing wrong would be appreciated! Also, please help me to correct this problem I'm facing (alternatively, I will migrate to the old and good tray icon (it works fine in 12.04, anyway) which I can handle very easily and efficiently)

4
  • what is the error you are getting?
    – Hernantz
    Jul 1, 2012 at 14:38
  • no error, it just crashes :)
    – hytromo
    Jul 1, 2012 at 22:44
  • Can you please add the Stacktrace from the crash to you question? That will point out the exact line at which your app is crashing. If you need help with that, then check out this link doc.qt.nokia.com/qtcreator-2.3/…
    – user2405
    Jul 3, 2012 at 17:48
  • 3
    Bottom line: do not mix GTK and Qt in a C++ application. The event loop is structured differently in each and you will run into nothing but trouble. Jul 3, 2012 at 20:25

2 Answers 2

9
+200

You shouldn't use libappindicator for creating an Application Indicator in Qt programs. There's a better way!

If you have sni-qt installed that will automagically replace QSystemTrayIcon instances with the code for rendering that tray icon as a KDE Status Notifier Item, which the Application Indicator service will pick up and show in the Ubuntu menu bar.

3
  • Thanks. I know perfectly how the QSystemTrayIcon works, and, as I can see, sni-qt is pre-installed, so I won't be sorry if I have it as a dependency! The rules should be more clear, though, on the indicator thingy (they recommend the use of indicators, while, in fact, Qt creates tray icons which are being transformed into indicators...). You will probably have the bounty, but I have to wait 17 hours.
    – hytromo
    Jul 4, 2012 at 0:25
  • 2
    This package(sni-qt) is now broken.
    – Goddard
    Sep 7, 2013 at 5:13
  • 2
    "There's a better way!" Not with Qt5, there isn't. Jun 22, 2014 at 23:43
-1

I would say you try passing the "this" pointer as a pointer like "*this" here

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

to

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);
1
  • Thanks, by I take this as an erro (it does not compile): error: cannot convert 'MainWindow' to 'gpointer {aka void*}' for argument '4' to 'gulong g_signal_connect_data(gpointer, const gchar*, GCallback, gpointer, GClosureNotify, GConnectFlags)'
    – hytromo
    Jul 1, 2012 at 22:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.