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-файлу необхідні для закуска бібліотеки.
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.