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.