Дмитрий
Дмитрий06 серпня 2017 р. 14:56

Використання JumpList для зберігання файлів, відкритих в додатку, при використанні Qt

JumpList, одна з можливостей, які присутні тільки в ОС Windows (версії 7 і вище). У цьому листі, зокрема, можна зберігати посилання на останні відкриті в додатку файли.


Покрокова інструкція

Для використання цієї функції необхідно

підключити модуль

QT += winextras

підключити бібліотеку

#include <QtWinExtras>

Зробити активним відповідний розділ JumpList

QWinJumpList jumplist;
jumplist.recent()->setVisible(true);

Асоціювати всі необхідні розширення файлів з нашим додатком за допомогою функції

static void associateFileTypes(const QStringList &fileTypes)
{
    QString displayName = QGuiApplication::applicationDisplayName();
    QString filePath = QCoreApplication::applicationFilePath();
    QString fileName = QFileInfo(filePath).fileName();
    QSettings settings("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\" + fileName, QSettings::NativeFormat);
    settings.setValue("FriendlyAppName", displayName);
    settings.beginGroup("SupportedTypes");
    foreach (const QString& fileType, fileTypes)
        settings.setValue(fileType, QString());
    settings.endGroup();
    settings.beginGroup("shell");
    settings.beginGroup("open");
    settings.setValue("FriendlyAppName", displayName);
    settings.beginGroup("Command");
    settings.setValue(".", QChar('"') + QDir::toNativeSeparators(filePath) + QString("\" \"%1\""));
}

яку зручно застосовувати в функції main

QApplication a(argc, argv);
a.setApplicationDisplayName("QtWinExtras Test");
associateFileTypes(QStringList(".txt"));

Тепер при відкритті нового файлу, посилання на нього буде додаватися в розділ останні JumpList.

При натисканні по одній з що з'явилися посилань відбудеться запуск нашого додатки з назвою файлу в якості другого параметра (argv [1]). При такій конфігурації розумно доопрацювати функцію main так, щоб відбувалася відкриття обраного файлу.

if(argc == 2)
        w.open(QString::fromLocal8Bit(argv[1]).replace(QString("\\"),QString("/")));

Також можлива реалізація, коли під час запуску програми перевіряється, чи існує запущена її копія. Якщо така копія знайдена, то додаток відправить в нього назву обраного файлу і завершить свою роботу. Я написав наступну реалізацію, де назва файлу, записується до реєстру.

    HANDLE hCorvetEvent = CreateEventA(NULL, FALSE, FALSE, ("winExJumpList"));
    if (GetLastError() ==  ERROR_ALREADY_EXISTS)
    {
        if(argc == 2)
        {
            QSettings *settings;
            settings = new QSettings("Company", "my programm");
            settings->setValue("AddFile", QString::fromLocal8Bit(argv[1]).replace(QString("\\"),QString("/") ) ); 
           CloseHandle(hCorvetEvent);
        }
        return 0;
    }

Програма за допомогою функції, яка спрацьовує за таймером відстежує зміну реєстру і відкриває доданий файл.

connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::openFile);
    QTimer *openFile = new QTimer;
    connect(openFile, &QTimer::timeout, this, &MainWindow::nextFile);
    openFile->start(500);
void MainWindow::nextFile()
{
    QSettings *settings;
    settings = new QSettings("Company", "my programm");
    QString s = settings->value("AddFile").toString();
    if(!s.isEmpty())
    {
        settings->setValue("AddFile", "");
        open(s);
    }
}

Природно, роботу програми ви побачите після того як додасте до скомпілювати exe-файлу необхідні для закуска бібліотеки.

Проект з вихідним текстом програми

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

c
  • 24 квітня 2018 р. 17:31
This is a nice start to learning how to use QWinJumplist but the demo files do not work when I try to load a file from the jump list Windows can't find the location of the file.
c
  • 24 квітня 2018 р. 23:41

Unless I right click on the Recent items and select to open the txt file through a second context menu as opposed to a straight double click of the item.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах