Vraag Hoe maak ik een werkende indicator met Qt / C ++ aan?


Ik gebruik Qt IDE om mijn applicatie te bouwen om deel te nemen aan de Ubuntu Showdown-wedstrijd. In mijn applicatie heb ik het volgende gedaan:

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

Dus eigenlijk probeer ik een eenvoudige indicatorinvoer aan te maken, die bij klikken de indicator verbergt en de toepassing weergeeft. De indicator kan met succes verborgen worden met het PASSIVE-ding daar, maar tijdens de gespreksgegevens-> show (); crasht de applicatie.

Alle hulp over wat ik verkeerd doe, wordt gewaardeerd! Help mij ook om dit probleem op te lossen waarmee ik geconfronteerd word (anders zal ik migreren naar het oude en goede pictogram in het systeemvak (het werkt prima in 12.04, hoe dan ook), wat ik heel gemakkelijk en efficiënt aankan)


8
2017-07-01 14:23


oorsprong


wat is de fout die je krijgt? - Hernantz
geen fout, het crasht gewoon :) - hytromo
Kun je alsjeblieft de Stacktrace toevoegen van de crash aan je vraag? Dat wijst op de exacte regel waarop uw app vastloopt. Als je hierbij hulp nodig hebt, bekijk dan deze link doc.qt.nokia.com/qtcreator-2.3/... - Chris Wilson
Bottom line: doen niet meng GTK en Qt in een C ++ -toepassing. De lus van het evenement is in elk geval anders gestructureerd en je zult alleen maar problemen tegenkomen. - Nathan Osman


antwoorden:


Je moet niet gebruiken libappindicator voor het maken van een toepassingsindicator in Qt-programma's. Er is een betere manier!

Als je hebt SNI-qt geïnstalleerd die automatisch wordt vervangen QSystemTrayIcon instanties met de code om dat pictogram in te stellen als een KDE Statusmelder Item, welke de Toepassingsindicator dienst zal ophalen en weergeven in de Ubuntu menubalk.


9
2017-07-03 19:47



Bedankt. Ik weet perfect hoe het QSystemTrayIcon werkt en, zoals ik zie, sni-qt is vooraf geïnstalleerd, dus het spijt me niet als ik het als een afhankelijkheid heb! De regels moeten echter duidelijker zijn voor wat betreft de indicator (ze bevelen het gebruik van indicatoren aan, terwijl Qt in feite bakpictogrammen maakt die worden omgezet in indicatoren ...). Je hebt waarschijnlijk de premie, maar ik moet 17 uur wachten. - hytromo
Dit pakket (sni-qt) is nu verbroken. - Goddard
"Er is een betere manier!" Niet met Qt5, dat is er niet. - Nathan Osman


Ik zou zeggen dat je de "dit" aanwijzer als een aanwijzer als "* dit" probeert door te geven hier

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

naar

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

-1
2017-07-01 14:48



Bedankt, door dit als een erro te nemen (het compileert niet): fout: kan 'MainWindow' niet naar 'gpointer {aka void *}' converteren voor argument '4' naar 'gulong g_signal_connect_data (gpointer, const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags) ' - hytromo