Прогресс панели задач KDE

Я пытаюсь показать прогресс в панели задач плазменного рабочего стола с помощью KDE Frameworks. Короче говоря, он хочет сделать то же самое, что и дельфин, когда копирует файлы:

Я немного застрял, потому что я даже не знаю, с чего начать. Единственное, что я нашел полезным, это KStatusBarJobTracker, но я не знаю, как его использовать. Я не мог найти учебники или примеры, как это сделать.

2 ответа

Решение

Правильно, так как выясняется, что вы правы, в настоящее время нет учебника для этого. Однако этот запрос на обзорную панель показывает, как он был реализован в KDevelop, и у вас должна быть возможность выполнить его через это:) https://git.reviewboard.kde.org/r/127050/

PS: то, что сейчас нет учебника, может быть хорошим способом помочь вам, написав небольшой, самостоятельный учебник для него... то, что я уверен, будет очень приветствоваться:)

Итак, покопавшись и благодаря помощи @leinir, я смог выяснить следующее:

  • Начиная с Plasma 5.6 KDE поддерживает API-интерфейс Unitiy DBus Launcher, который можно использовать, например, для отображения прогресса
  • Я нашел пост в AskUbuntu, который объясняет, как использовать API с Qt

Настоящая проблема: это работает, только если у вас есть действительный файл рабочего стола в одном из стандартных мест! Вам нужно передать файл как параметр сообщения DBus, чтобы он работал.

Основываясь на этой информации, я выяснил, как ее использовать, и создал репозиторий GitHub, который поддерживает работу с кроссплатформенными панелями задач и использует этот API для реализации linux.

Тем не менее, вот как это сделать в любом случае. Он должен работать для KDE Plasma и рабочего стола Unity, может быть, больше (не пробовал других):

  1. Создать .desktop файл для вашего приложения. В целях тестирования это может быть "фиктивный" файл, который может выглядеть следующим образом:

    [Desktop Entry]
    Type=Application
    Version=1.1
    Name=MyApp
    Exec=<path_to>/MyApp
    
  2. Скопируйте этот файл в ~/.local/share/applications/ (или куда бы пользовательские файлы рабочего стола не заходили в вашу систему)

  3. В вашем коде все, что вам нужно сделать, это выполнить следующий код, чтобы обновить состояние панели задач:

    auto message = QDBusMessage::createSignal(QStringLiteral("/com/example/MyApp"),
                                              QStringLiteral("com.canonical.Unity.LauncherEntry"),
                                              QStringLiteral("Update"));
    
    //you don't always have to specify all parameters, just the ones you want to update
    properties.insert(QStringLiteral("progress-visible"), true);// enable the progress
    properties.insert(QStringLiteral("progress"), 0.5);// set the progress value (from 0.0 to 1.0)
    properties.insert(QStringLiteral("count-visible"), true);// display the "counter badge"
    properties.insert(QStringLiteral("count"), 42);// set the counter value
    
    message << QStringLiteral("application://myapp.desktop") //assuming you named the desktop file "myapp.desktop"
            << params;
    QDBusConnection::sessionBus().send(message);
    
  4. Скомпилируйте и запустите ваше приложение. Вам не нужно запускать его через файл рабочего стола, по крайней мере, мне это не нужно. Если вы хотите быть уверены, что ваше приложение "подключено" к этому файлу рабочего стола, просто установите специальный значок для этого файла. Ваше приложение должно показать этот значок на панели задач.

И это в основном это. Примечание. Система запоминает последнее состояние при перезапуске приложения. Таким образом, вы должны сбросить все эти параметры один раз при запуске приложения.

Другие вопросы по тегам