如何使用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中都可以正常工作),我可以非常轻松有效地处理它)


您遇到的错误是什么?
Hernantz

没有错误,它只是崩溃:)
hytromo

您能从崩溃中添加Stacktrace吗?这将指出您的应用崩溃的确切行。如果您需要与帮助,然后看看这个链接doc.qt.nokia.com/qtcreator-2.3/...

3
底线:你不能在一个C ++应用程序混合GTK和Qt。每个事件循环的结构都不同,您只会遇到麻烦。
内森·奥斯曼

Answers:


9

您不应使用libappindicator在Qt程序中创建应用程序指示器。有更好的方法!

如果你有SNI-QT安装的它将自动替换QSystemTrayIcon的代码实例用于呈现托盘图标为KDE状态通知项,其中申请指标服务将拿起并显示在Ubuntu的菜单栏


谢谢。我完全了解QSystemTrayIcon的工作方式,并且正如我所看到的那样,sni-qt已预先安装,因此如果我将其作为依赖项,我不会后悔!但是,关于指示器的规则应该更清楚(它们建议使用指示器,而实际上,Qt会创建托盘图标,这些图标将被转换为指示器...)。您可能会得到赏金,但是我必须等待17个小时。
hytromo

2
该软件包(sni-qt)现在已损坏。
Goddard

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

谢谢,我将此视为错误(无法编译):错误:无法将参数'4'的'MainWindow'转换为'gpointer {aka void *}'到'gulong g_signal_connect_data(gpointer,const gchar *,GCallback, gpointer,GClosureNotify,GConnectFlags)”
hytromo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.