Qt / C ++로 작동 지표를 작성하는 방법


8

Ubuntu Showdown 공모전에 참여하기 위해 응용 프로그램을 빌드하기 위해 Qt IDE를 사용하고 있습니다. 내 응용 프로그램에서 다음을 수행했습니다.

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를 혼합 하지 마십시오 . 이벤트 루프는 각각 다르게 구성되며 문제가 발생합니다.
Nathan Osman

답변:


9

Qt 프로그램에서 어플리케이션 인디케이터를 작성하기 위해 libappindicator 를 사용해서는 안됩니다 . 더 좋은 방법이 있습니다!

당신이있는 경우 SNI를-Qt는 그것이 자동적으로 대체합니다 설치 QSystemTrayIcon의 A와 그 트레이 아이콘을 렌더링하기위한 코드 인스턴스를 KDE 항목 알리미 상태 1, 응용 프로그램 표시 에서 서비스가 데리러와 쇼 우분투 메뉴 모음 .


감사. QSystemTrayIcon이 어떻게 작동하는지 완벽하게 알고 있습니다. 보시다시피 sni-qt가 사전 설치되어 있으므로 종속성으로 사용하면 미안하지 않습니다! 그러나 규칙은 지표에 대해 더 명확해야합니다 (지표 사용을 권장하지만 실제로 Qt는 지표 아이콘으로 표시되는 트레이 아이콘을 만듭니다 ...). 당신은 현상금이있을 것입니다,하지만 난 17 시간 기다려야합니다.
hytromo

2
이 패키지 (sni-qt)는 이제 고장났습니다.
Goddard

2
"더 나은 방법이 있습니다!" Qt5가 없으면 없습니다.
Nathan Osman 2016 년

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

고마워, 나는 이것을 오류 (컴파일하지 않음)로 생각합니다 : error : 인수 '4'에 대해 'MainWindow'를 'gpointer {aka void *}'로 변환 할 수 없습니다. gpointer, GClosureNotify, GConnectFlags) '
hytromo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.