Деякий час назад я написав кілька статей про використання бібліотеки QtWinExtras, яка відкриває доступ до спеціальних, доступним тільки для ОС Windows. Тепер хочеться сказати пару слів про те, як повторити теж c використанням QML. Для цього нам знадобиться створити проект Qt Quick, підключити в проекті модуль winextras
import QtWinExtras 1.0
і використовувати 3 об'єкти: TaskbarButton для створення рядком прогресу і управління нею, ThumbnailToolBar для роботи кнопками на спливаючому вікні панелі задач і JumpList (для роботи з jumpList). Також додамо FileDialog для повноцінної роботи jumpList.
Для TaskbarButton необхідно задати властивості id (для доступу до цього об'єкта з поза), progress.visible: true. Додатково можна встановити іконку overlay.iconSource.
У ThumbnailToolBar створюємо кнопки ThumbnailToolButton (від однієї до семи), встановлюємо іконки і пишемо обробку натискання.
У JumpList робить видимим розділ recent для відображення останніх відкритих файлів і frequent для відображення часто відкриваються файлів.
JumpList { id: jumpList recent.visible: true frequent.visible: true }
Не забуваємо про те, що розширення файлів потрапляють в jumpList повинні бути прописані в реєстрі. Тому в файл main додаємо функцію associateFileTypes (), як показано в попередній статті .
Ще одна цікава можливість - установка прозорості вікна. Для цього знадобиться об'єкт DwmFeatures. Його властивість blurBehindEnabled робить вікно прозорим, якщо його значення true. При установці його в false колір фону стає чорним. Зазначу також, що прозорість можна встановити за допомогою властивості opacity об'єкта Window. Відмінності його від blurBehindEnabled в тому, що воно може мати тільки 2 стану (прозорий і непрозорий) і робить прозорим тільки основну частину вікна (без розміщених на ньому віджетів), в той час як opacity встановлює ступінь прозорості і робить прозорим вікно цілком з усіма віджетами і рамкою. Ще 4 властивості leftGlassMargin, rightGlassMargin, topGlassMargin і bottomGlassMargin відповідають за розмір додаткового відступу від краю вікна з лівої, правої, верхньої та нижньої сторони відповідно. Величини відступів задаються в пікселях. Значення за замовчуванням рівні 0. прикладного застосування в цих властивостях я не бачу, але написав про них для повноти картини.
Main.qml
import QtQuick 2.6 import QtQuick.Window 2.2 import QtQuick.Controls 2.0 import QtQuick.Dialogs 1.0 import QtWinExtras 1.0 Window { visible: true width: 640 height: 480 title: qsTr("Hello WinExtras") DwmFeatures { id: dwmFeatures blurBehindEnabled: true leftGlassMargin : 10 rightGlassMargin : 10 topGlassMargin : 10 bottomGlassMargin : 10 excludedFromPeek : false peekDisallowed : false flip3DPolicy: QtWin.FlipExcludeBelow } Button{ x:100 y:200 width:200 height: 100 text: "button" } TaskbarButton { id: taskbarButton //overlay.iconSource: "loading.png" overlay.accessibleDescription: "Loading" progress.visible: true progress.value: 50 } ThumbnailToolBar { ThumbnailToolButton { iconSource: "r.png"; tooltip: "Next"; onClicked: taskbarButton.progress.value = taskbarButton.progress.value+1 } ThumbnailToolButton { iconSource: "l.png"; tooltip: "Prep"; onClicked: taskbarButton.progress.value = taskbarButton.progress.value-1 } ThumbnailToolButton { iconSource: "pause.png"; tooltip: "Pause"; onClicked: taskbarButton.progress.setPaused(!taskbarButton.progress.paused) } ThumbnailToolButton { interactive: false; flat: true } ThumbnailToolButton { iconSource: "open.png"; tooltip: "OpenFile"; onClicked: fileDialog.open()} ThumbnailToolButton { iconSource: "exit.png"; tooltip: "Open"; onClicked: Qt.quit() } } JumpList { id: jumpList recent.visible: true frequent.visible: true //tasks.visible: true } FileDialog { id: fileDialog selectFolder: true title: "Please choose a file" folder: shortcuts.home onAccepted: { console.log("You chose: " + fileDialog.fileUrls) } } }
Main.cpp
clude <QFileInfo> #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QDir> #include <QSettings> static void associateFileTypes(const QStringList &fileTypes) { QString displayName = QGuiApplication::applicationDisplayName(); QString filePath = QCoreApplication::applicationFilePath(); QString fileName = QFileInfo(filePath).fileName(); //qDebug() << displayName << 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\"")); } int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); app.setApplicationDisplayName("QtWinExtras Test"); associateFileTypes(QStringList(".txt")); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); }