Как мне создать рабочий индикатор с Qt / C ++?

8

Я использую Qt IDE для создания своего приложения, чтобы участвовать в конкурсе Ubuntu Showdown. В моем приложении я сделал следующее:

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

Итак, в основном я пытаюсь сделать простую запись индикатора, которая, при нажатии, будет скрывать индикатор и отображать приложение. Индикатор может быть успешно скрыт с помощью PASSIVE, но во время вызова data-> show (); приложение вылетает.

Буду признателен за любую помощь в том, что я делаю неправильно! Также, пожалуйста, помогите мне исправить эту проблему, с которой я сталкиваюсь (в качестве альтернативы я перейду к старому и хорошему значку в трее (в любом случае он отлично работает в 12.04), с которым я могу справиться очень легко и эффективно)

hytromo
источник
какую ошибку вы получаете?
Эрнанц
без ошибок, просто вылетает :)
hytromo
Можете ли вы добавить Stacktrace от аварии к вам вопрос? Это укажет точную линию, в которой ваше приложение падает. Если вам нужна помощь в этом, перейдите по
3
Итог: не смешивайте GTK и Qt в приложении C ++. Цикл событий по-разному структурирован в каждом, и вы столкнетесь только с неприятностями.
Натан Осман

Ответы:

9

Вы не должны использовать libappindicator для создания индикатора приложения в программах Qt. Есть лучший способ!

Если у вас установлен sni-qt, который автоматически заменит экземпляры QSystemTrayIcon кодом для рендеринга этого значка в трее как элемента уведомлений о состоянии KDE , который сервис Application Indicator подберет и отобразит в строке меню Ubuntu .

Тед Гулд
источник
Спасибо. Я прекрасно знаю, как работает QSystemTrayIcon, и, как я вижу, sni-qt предустановлен, поэтому я не буду сожалеть, если у меня будет его зависимость! Тем не менее, правила должны быть более понятными в отношении индикатора (они рекомендуют использовать индикаторы, в то время как Qt создает иконки в трее, которые преобразуются в индикаторы ...). Вы, вероятно, получите награду, но мне придется ждать 17 часов.
Hytromo
2
Этот пакет (sni-qt) теперь сломан.
Годдард
2
"Есть лучший способ!" Не с Qt5, нет.
Натан Осман
-1

Я бы сказал, что вы пытаетесь передать указатель "this" как указатель типа "* this" здесь

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

в

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);
Hernantz
источник
Спасибо, я воспринимаю это как ошибку (не компилируется): error: невозможно преобразовать 'MainWindow' в 'gpointer {aka void *}' для аргумента '4' в 'gulong g_signal_connect_data (gpointer, const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags) '
Hytromo