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\"")); }
Который удобно использовать в основном
QApplication a(argc, argv); a.setApplicationDisplayName("QtWinExtras Test"); associateFileTypes(QStringList(".txt"));
Теперь при открытии нового файла ссылка на него будет добавлена в последний раздел JumpList.
При нажатии на одну из появившихся ссылок наше приложение запустится с именем файла в качестве второго параметра (argv[1]). При такой конфигурации разумно модифицировать основную функцию, чтобы открывался выбранный файл.
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.