Дмитрий
7 августа 2017 г. 0:56

Использование JumpList для хранения файлов, открытых в приложении, при использовании Qt

JumpList, одна из функций, присутствующих только в Windows (версия 7 и выше). На этом листе, в частности, вы можете хранить ссылки на самые последние открытые файлы в приложении.


Пошаговая инструкция

Чтобы использовать эту функцию, вам нужно

Подключить модуль

  1. QT += winextras

Подключить библиотеку

  1. #include <QtWinExtras>

Сделайте активным соответствующий раздел JumpList

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

Свяжите все необходимые расширения файлов с нашим приложением с помощью функции

  1. static void associateFileTypes(const QStringList &fileTypes)
  2. {
  3. QString displayName = QGuiApplication::applicationDisplayName();
  4. QString filePath = QCoreApplication::applicationFilePath();
  5. QString fileName = QFileInfo(filePath).fileName();
  6. QSettings settings("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\" + fileName, QSettings::NativeFormat);
  7. settings.setValue("FriendlyAppName", displayName);
  8. settings.beginGroup("SupportedTypes");
  9. foreach (const QString& fileType, fileTypes)
  10. settings.setValue(fileType, QString());
  11. settings.endGroup();
  12. settings.beginGroup("shell");
  13. settings.beginGroup("open");
  14. settings.setValue("FriendlyAppName", displayName);
  15. settings.beginGroup("Command");
  16. settings.setValue(".", QChar('"') + QDir::toNativeSeparators(filePath) + QString("\" \"%1\""));
  17. }

Который удобно использовать в основном

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

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

При нажатии на одну из появившихся ссылок наше приложение запустится с именем файла в качестве второго параметра (argv[1]). При такой конфигурации разумно модифицировать основную функцию, чтобы открывался выбранный файл.

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

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

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

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

  1. connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::openFile);
  2. QTimer *openFile = new QTimer;
  3. connect(openFile, &QTimer::timeout, this, &MainWindow::nextFile);
  4. openFile->start(500);
  5. void MainWindow::nextFile()
  6. {
  7. QSettings *settings;
  8. settings = new QSettings("Company", "my programm");
  9. QString s = settings->value("AddFile").toString();
  10. if(!s.isEmpty())
  11. {
  12. settings->setValue("AddFile", "");
  13. open(s);
  14. }
  15. }

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

Проект с исходниками программы

Вам это нравится? Поделитесь в социальных сетях!

c
  • 25 апреля 2018 г. 3: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
  • 25 апреля 2018 г. 9: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.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь