From 0bf52fd5c57b19332465e09753cc436455062684 Mon Sep 17 00:00:00 2001
From: wah <1146869587@qq.com>
Date: 星期五, 15 十一月 2024 11:09:28 +0800
Subject: [PATCH] bbb

---
 quicknanobrowser/icons/3rdparty/view-refresh.png      |    0 
 minimal/minimal.pro.user                              |  263 ++++++
 quicknanobrowser/ApplicationRoot.qml                  |   89 ++
 quicknanobrowser/FindBar.qml                          |  146 +++
 quicknanobrowser/icons/3rdparty/process-stop.png      |    0 
 minimal/minimal.pro                                   |   10 
 quicknanobrowser/doc/src/quicknanobrowser.qdoc        |  149 +++
 quicknanobrowser/FullScreenNotification.qml           |  109 ++
 quicknanobrowser/icons/3rdparty/go-previous.png       |    0 
 quicknanobrowser/icons/3rdparty/COPYING               |    1 
 quicknanobrowser/BrowserWindow.qml                    |  724 +++++++++++++++++
 quicknanobrowser/utils.h                              |   70 +
 quicknanobrowser/quicknanobrowser.pro.user            |  263 ++++++
 quicknanobrowser/quicknanobrowser.pro                 |   25 
 quicknanobrowser/icons/3rdparty/go-next.png           |    0 
 minimal/doc/src/minimal.qdoc                          |   91 ++
 minimal/main.qml                                      |   63 +
 quicknanobrowser/BrowserDialog.qml                    |   74 +
 quicknanobrowser/icons/3rdparty/qt_attribution.json   |   24 
 quicknanobrowser/resources.qrc                        |   16 
 quicknanobrowser/main.cpp                             |   97 ++
 quicknanobrowser/doc/images/quicknanobrowser-demo.jpg |    0 
 quicknanobrowser/DownloadView.qml                     |  175 ++++
 minimal/main.cpp                                      |   68 +
 minimal/qml.qrc                                       |    6 
 25 files changed, 2,463 insertions(+), 0 deletions(-)

diff --git a/minimal/doc/src/minimal.qdoc b/minimal/doc/src/minimal.qdoc
new file mode 100644
index 0000000..4fc62bd
--- /dev/null
+++ b/minimal/doc/src/minimal.qdoc
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+    \example webengine/minimal
+    \title WebEngine Qt Quick Minimal Example
+    \ingroup webengine-examples
+    \brief Displays a web page using the Qt Quick integration of \QWE.
+
+    \image minimal-example.png
+
+    \e {WebEngine Qt Quick Minimal Example} demonstrates how to use the
+    \l{WebEngineView} item to render a web page. It shows the minimum amount of
+    code needed to load and display an HTML page, and can be used as a basis for
+    further experimentation.
+
+    \include examples-run.qdocinc
+
+    \section1 C++ Code
+
+    In \c main.cpp we use only the QGuiApplication and QQmlApplicationEngine
+    classes. We also include \c qtwebengineglobal.h to be able to use
+    \l{QtWebEngine::initialize}.
+
+    \quotefromfile webengine/minimal/main.cpp
+    \skipto #include
+    \printto main
+
+    In the \c main function we first set the
+    \l{QCoreApplication::organizationName} property. This affects the locations
+    where \QWE stores persistent and cached data (see also
+    \l{WebEngineProfile::cachePath} and
+    \l{WebEngineProfile::persistentStoragePath}).
+
+    We also set the Qt::AA_EnableHighDpiScaling attribute. This lets the web
+    view automatically scale on high-dpi displays. Then we instantiate a
+    QGuiApplication object.
+
+    Next, we call \l{QtWebEngine::initialize}, which makes sure that OpenGL
+    contexts can be shared between the main process and the dedicated renderer
+    process (\c QtWebEngineProcess). This method needs to be called before
+    any OpenGL context is created.
+
+    Then we create a QQmlApplicationEngine, and tell it to load \c main.qml
+    from the \l{The Qt Resource System}{Qt Resource System}.
+
+    Finally, QGuiApplication::exec() launches the main event loop.
+
+    \printuntil }
+
+    \section1 QML Code
+
+    In \c main.qml we create the top level window, set a sensible default size
+    and make it visible. The window will be filled by a WebEngineView item
+    loading the \l{Qt Homepage}.
+
+    \quotefromfile webengine/minimal/main.qml
+    \skipto import
+    \printuntil }
+    \printline }
+
+    \section1 Requirements
+
+    The example requires a working internet connection to render the
+    \l{Qt Homepage}.
+    An optional system proxy should be picked up automatically.
+*/
diff --git a/minimal/main.cpp b/minimal/main.cpp
new file mode 100644
index 0000000..86109f9
--- /dev/null
+++ b/minimal/main.cpp
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGuiApplication>
+#include <QQmlApplicationEngine>
+#include <qtwebengineglobal.h>
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication::setOrganizationName("QtExamples");
+    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+    QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
+    QtWebEngine::initialize();
+    QGuiApplication app(argc, argv);
+
+    QQmlApplicationEngine engine;
+    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
+
+    return app.exec();
+}
+
diff --git a/minimal/main.qml b/minimal/main.qml
new file mode 100644
index 0000000..75082f9
--- /dev/null
+++ b/minimal/main.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Window 2.0
+import QtWebEngine 1.0
+
+Window {
+    width: 1024
+    height: 750
+    visible: true
+    WebEngineView {
+        anchors.fill: parent
+        url: "https://www.qt.io"
+    }
+}
diff --git a/minimal/minimal.pro b/minimal/minimal.pro
new file mode 100644
index 0000000..23ce01d
--- /dev/null
+++ b/minimal/minimal.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+
+QT += webengine
+
+SOURCES += main.cpp
+
+RESOURCES += qml.qrc
+
+target.path = $$[QT_INSTALL_EXAMPLES]/webengine/minimal
+INSTALLS += target
diff --git a/minimal/minimal.pro.user b/minimal/minimal.pro.user
new file mode 100644
index 0000000..7216296
--- /dev/null
+++ b/minimal/minimal.pro.user
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE QtCreatorProject>
+<!-- Written by QtCreator 11.0.2, 2024-11-15T11:07:50. -->
+<qtcreator>
+ <data>
+  <variable>EnvironmentId</variable>
+  <value type="QByteArray">{4fa440ca-08dc-4209-a92b-70ac9b95467e}</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.ActiveTarget</variable>
+  <value type="qlonglong">0</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.EditorSettings</variable>
+  <valuemap type="QVariantMap">
+   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
+   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
+    <value type="QString" key="language">Cpp</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
+    </valuemap>
+   </valuemap>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
+    <value type="QString" key="language">QmlJS</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
+    </valuemap>
+   </valuemap>
+   <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
+   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
+   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
+   <value type="int" key="EditorConfiguration.IndentSize">4</value>
+   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
+   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
+   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
+   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
+   <value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
+   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
+   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
+   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
+   <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
+   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
+   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
+   <value type="int" key="EditorConfiguration.TabSize">8</value>
+   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
+   <value type="bool" key="EditorConfiguration.UseIndenter">false</value>
+   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
+   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
+   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
+   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
+   <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
+   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
+   <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
+   <value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.PluginSettings</variable>
+  <valuemap type="QVariantMap">
+   <valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
+    <value type="bool" key="AutoTest.Framework.Boost">true</value>
+    <value type="bool" key="AutoTest.Framework.CTest">false</value>
+    <value type="bool" key="AutoTest.Framework.Catch">true</value>
+    <value type="bool" key="AutoTest.Framework.GTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtTest">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
+   <value type="int" key="AutoTest.RunAfterBuild">0</value>
+   <value type="bool" key="AutoTest.UseGlobal">true</value>
+   <valuemap type="QVariantMap" key="ClangTools">
+    <value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
+    <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
+    <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
+    <value type="int" key="ClangTools.ParallelJobs">12</value>
+    <value type="bool" key="ClangTools.PreferConfigFile">true</value>
+    <valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
+    <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
+    <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
+    <value type="bool" key="ClangTools.UseGlobalSettings">true</value>
+   </valuemap>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.0</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="DeviceType">Desktop</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 MSVC2019 32bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 MSVC2019 32bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.win32_msvc2019_kit</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Qt\Examples\Qt-5.15.2\webengine\build-minimal-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Qt/Examples/Qt-5.15.2/webengine/build-minimal-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Qt\Examples\Qt-5.15.2\webengine\build-minimal-Desktop_Qt_5_15_2_MSVC2019_32bit-Release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Qt/Examples/Qt-5.15.2/webengine/build-minimal-Desktop_Qt_5_15_2_MSVC2019_32bit-Release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Qt\Examples\Qt-5.15.2\webengine\build-minimal-Desktop_Qt_5_15_2_MSVC2019_32bit-Profile</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Qt/Examples/Qt-5.15.2/webengine/build-minimal-Desktop_Qt_5_15_2_MSVC2019_32bit-Profile</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+    <value type="int" key="SeparateDebugInfo">0</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">閮ㄧ讲</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">閮ㄧ讲</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
+    <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="CustomOutputParsers"/>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/Qt/Examples/Qt-5.15.2/webengine/minimal/minimal.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/Qt/Examples/Qt-5.15.2/webengine/minimal/minimal.pro</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/Qt/Examples/Qt-5.15.2/webengine/build-minimal-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.TargetCount</variable>
+  <value type="qlonglong">1</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">22</value>
+ </data>
+ <data>
+  <variable>Version</variable>
+  <value type="int">22</value>
+ </data>
+</qtcreator>
diff --git a/minimal/qml.qrc b/minimal/qml.qrc
new file mode 100644
index 0000000..0ff3892
--- /dev/null
+++ b/minimal/qml.qrc
@@ -0,0 +1,6 @@
+<RCC>
+    <qresource prefix="/">
+        <file>main.qml</file>
+    </qresource>
+</RCC>
+
diff --git a/quicknanobrowser/ApplicationRoot.qml b/quicknanobrowser/ApplicationRoot.qml
new file mode 100644
index 0000000..df4bbdb
--- /dev/null
+++ b/quicknanobrowser/ApplicationRoot.qml
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtWebEngine 1.10
+
+QtObject {
+    id: root
+
+    property QtObject defaultProfile: WebEngineProfile {
+        storageName: "Profile"
+        offTheRecord: false
+        useForGlobalCertificateVerification: true
+    }
+
+    property QtObject otrProfile: WebEngineProfile {
+        offTheRecord: true
+    }
+
+    property Component browserWindowComponent: BrowserWindow {
+        applicationRoot: root
+        onClosing: destroy()
+    }
+    property Component browserDialogComponent: BrowserDialog {
+        onClosing: destroy()
+    }
+    function createWindow(profile) {
+        var newWindow = browserWindowComponent.createObject(root);
+        newWindow.currentWebView.profile = profile;
+        profile.downloadRequested.connect(newWindow.onDownloadRequested);
+        return newWindow;
+    }
+    function createDialog(profile) {
+        var newDialog = browserDialogComponent.createObject(root);
+        newDialog.currentWebView.profile = profile;
+        return newDialog;
+    }
+    function load(url) {
+        var browserWindow = createWindow(defaultProfile);
+        browserWindow.currentWebView.url = url;
+    }
+}
diff --git a/quicknanobrowser/BrowserDialog.qml b/quicknanobrowser/BrowserDialog.qml
new file mode 100644
index 0000000..a7ff9a5
--- /dev/null
+++ b/quicknanobrowser/BrowserDialog.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Window 2.2
+import QtWebEngine 1.9
+
+Window {
+    id: window
+    property alias currentWebView: webView
+    flags: Qt.Dialog | Qt.WindowStaysOnTopHint
+    width: 800
+    height: 600
+    visible: true
+    onClosing: destroy()
+    WebEngineView {
+        id: webView
+        anchors.fill: parent
+
+        onGeometryChangeRequested: function(geometry) {
+            window.x = geometry.x
+            window.y = geometry.y
+            window.width = geometry.width
+            window.height = geometry.height
+        }
+    }
+}
diff --git a/quicknanobrowser/BrowserWindow.qml b/quicknanobrowser/BrowserWindow.qml
new file mode 100644
index 0000000..c595c3b
--- /dev/null
+++ b/quicknanobrowser/BrowserWindow.qml
@@ -0,0 +1,724 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt.labs.settings 1.0
+import QtQml 2.2
+import QtQuick 2.2
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Private 1.0 as QQCPrivate
+import QtQuick.Controls.Styles 1.0
+import QtQuick.Dialogs 1.2
+import QtQuick.Layouts 1.0
+import QtQuick.Window 2.1
+import QtWebEngine 1.10
+
+ApplicationWindow {
+    id: browserWindow
+    property QtObject applicationRoot
+    property Item currentWebView: tabs.currentIndex < tabs.count ? tabs.getTab(tabs.currentIndex).item : null
+    property int previousVisibility: Window.Windowed
+
+    width: 1300
+    height: 900
+    visible: true
+    title: currentWebView && currentWebView.title
+
+    // Make sure the Qt.WindowFullscreenButtonHint is set on OS X.
+    Component.onCompleted: flags = flags | Qt.WindowFullscreenButtonHint
+
+    onCurrentWebViewChanged: {
+        findBar.reset();
+    }
+
+    // Create a styleItem to determine the platform.
+    // When using style "mac", ToolButtons are not supposed to accept focus.
+    QQCPrivate.StyleItem { id: styleItem }
+    property bool platformIsMac: styleItem.style == "mac"
+
+    Settings {
+        id : appSettings
+        property alias autoLoadImages: loadImages.checked
+        property alias javaScriptEnabled: javaScriptEnabled.checked
+        property alias errorPageEnabled: errorPageEnabled.checked
+        property alias pluginsEnabled: pluginsEnabled.checked
+        property alias fullScreenSupportEnabled: fullScreenSupportEnabled.checked
+        property alias autoLoadIconsForPage: autoLoadIconsForPage.checked
+        property alias touchIconsEnabled: touchIconsEnabled.checked
+        property alias webRTCPublicInterfacesOnly : webRTCPublicInterfacesOnly.checked
+        property alias devToolsEnabled: devToolsEnabled.checked
+        property alias pdfViewerEnabled: pdfViewerEnabled.checked
+    }
+
+    Action {
+        shortcut: "Ctrl+D"
+        onTriggered: {
+            downloadView.visible = !downloadView.visible;
+        }
+    }
+    Action {
+        id: focus
+        shortcut: "Ctrl+L"
+        onTriggered: {
+            addressBar.forceActiveFocus();
+            addressBar.selectAll();
+        }
+    }
+    Action {
+        shortcut: StandardKey.Refresh
+        onTriggered: {
+            if (currentWebView)
+                currentWebView.reload();
+        }
+    }
+    Action {
+        shortcut: StandardKey.AddTab
+        onTriggered: {
+            tabs.createEmptyTab(tabs.count != 0 ? currentWebView.profile : defaultProfile);
+            tabs.currentIndex = tabs.count - 1;
+            addressBar.forceActiveFocus();
+            addressBar.selectAll();
+        }
+    }
+    Action {
+        shortcut: StandardKey.Close
+        onTriggered: {
+            currentWebView.triggerWebAction(WebEngineView.RequestClose);
+        }
+    }
+    Action {
+        shortcut: StandardKey.Quit
+        onTriggered: browserWindow.close()
+    }
+    Action {
+        shortcut: "Escape"
+        onTriggered: {
+            if (currentWebView.state == "FullScreen") {
+                browserWindow.visibility = browserWindow.previousVisibility;
+                fullScreenNotification.hide();
+                currentWebView.triggerWebAction(WebEngineView.ExitFullScreen);
+            }
+
+            if (findBar.visible)
+                findBar.visible = false;
+        }
+    }
+    Action {
+        shortcut: "Ctrl+0"
+        onTriggered: currentWebView.zoomFactor = 1.0
+    }
+    Action {
+        shortcut: StandardKey.ZoomOut
+        onTriggered: currentWebView.zoomFactor -= 0.1
+    }
+    Action {
+        shortcut: StandardKey.ZoomIn
+        onTriggered: currentWebView.zoomFactor += 0.1
+    }
+
+    Action {
+        shortcut: StandardKey.Copy
+        onTriggered: currentWebView.triggerWebAction(WebEngineView.Copy)
+    }
+    Action {
+        shortcut: StandardKey.Cut
+        onTriggered: currentWebView.triggerWebAction(WebEngineView.Cut)
+    }
+    Action {
+        shortcut: StandardKey.Paste
+        onTriggered: currentWebView.triggerWebAction(WebEngineView.Paste)
+    }
+    Action {
+        shortcut: "Shift+"+StandardKey.Paste
+        onTriggered: currentWebView.triggerWebAction(WebEngineView.PasteAndMatchStyle)
+    }
+    Action {
+        shortcut: StandardKey.SelectAll
+        onTriggered: currentWebView.triggerWebAction(WebEngineView.SelectAll)
+    }
+    Action {
+        shortcut: StandardKey.Undo
+        onTriggered: currentWebView.triggerWebAction(WebEngineView.Undo)
+    }
+    Action {
+        shortcut: StandardKey.Redo
+        onTriggered: currentWebView.triggerWebAction(WebEngineView.Redo)
+    }
+    Action {
+        shortcut: StandardKey.Back
+        onTriggered: currentWebView.triggerWebAction(WebEngineView.Back)
+    }
+    Action {
+        shortcut: StandardKey.Forward
+        onTriggered: currentWebView.triggerWebAction(WebEngineView.Forward)
+    }
+    Action {
+        shortcut: StandardKey.Find
+        onTriggered: {
+            if (!findBar.visible)
+                findBar.visible = true;
+        }
+    }
+    Action {
+        shortcut: StandardKey.FindNext
+        onTriggered: findBar.findNext()
+    }
+    Action {
+        shortcut: StandardKey.FindPrevious
+        onTriggered: findBar.findPrevious()
+    }
+
+    toolBar: ToolBar {
+        id: navigationBar
+            RowLayout {
+                anchors.fill: parent
+                ToolButton {
+                    enabled: currentWebView && (currentWebView.canGoBack || currentWebView.canGoForward)
+                    menu:Menu {
+                        id: historyMenu
+
+                        Instantiator {
+                            model: currentWebView && currentWebView.navigationHistory.items
+                            MenuItem {
+                                text: model.title
+                                onTriggered: currentWebView.goBackOrForward(model.offset)
+                                checkable: !enabled
+                                checked: !enabled
+                                enabled: model.offset
+                            }
+
+                            onObjectAdded: function(index, object) {
+                                historyMenu.insertItem(index, object)
+                            }
+                            onObjectRemoved: function(index, object) {
+                                historyMenu.removeItem(object)
+                            }
+                        }
+                    }
+                }
+
+                ToolButton {
+                    id: backButton
+                    iconSource: "icons/go-previous.png"
+                    onClicked: currentWebView.goBack()
+                    enabled: currentWebView && currentWebView.canGoBack
+                    activeFocusOnTab: !browserWindow.platformIsMac
+                }
+                ToolButton {
+                    id: forwardButton
+                    iconSource: "icons/go-next.png"
+                    onClicked: currentWebView.goForward()
+                    enabled: currentWebView && currentWebView.canGoForward
+                    activeFocusOnTab: !browserWindow.platformIsMac
+                }
+                ToolButton {
+                    id: reloadButton
+                    iconSource: currentWebView && currentWebView.loading ? "icons/process-stop.png" : "icons/view-refresh.png"
+                    onClicked: currentWebView && currentWebView.loading ? currentWebView.stop() : currentWebView.reload()
+                    activeFocusOnTab: !browserWindow.platformIsMac
+                }
+                TextField {
+                    id: addressBar
+                    Image {
+                        anchors.verticalCenter: addressBar.verticalCenter;
+                        x: 5
+                        z: 2
+                        id: faviconImage
+                        width: 16; height: 16
+                        sourceSize: Qt.size(width, height)
+                        source: currentWebView && currentWebView.icon ? currentWebView.icon : ''
+                    }
+                    style: TextFieldStyle {
+                        padding {
+                            left: 26;
+                        }
+                    }
+                    focus: true
+                    Layout.fillWidth: true
+                    text: currentWebView && currentWebView.url
+                    onAccepted: currentWebView.url = utils.fromUserInput(text)
+                }
+                ToolButton {
+                    id: settingsMenuButton
+                    menu: Menu {
+                        MenuItem {
+                            id: loadImages
+                            text: "Autoload images"
+                            checkable: true
+                            checked: WebEngine.settings.autoLoadImages
+                        }
+                        MenuItem {
+                            id: javaScriptEnabled
+                            text: "JavaScript On"
+                            checkable: true
+                            checked: WebEngine.settings.javascriptEnabled
+                        }
+                        MenuItem {
+                            id: errorPageEnabled
+                            text: "ErrorPage On"
+                            checkable: true
+                            checked: WebEngine.settings.errorPageEnabled
+                        }
+                        MenuItem {
+                            id: pluginsEnabled
+                            text: "Plugins On"
+                            checkable: true
+                            checked: true
+                        }
+                        MenuItem {
+                            id: fullScreenSupportEnabled
+                            text: "FullScreen On"
+                            checkable: true
+                            checked: WebEngine.settings.fullScreenSupportEnabled
+                        }
+                        MenuItem {
+                            id: offTheRecordEnabled
+                            text: "Off The Record"
+                            checkable: true
+                            checked: currentWebView && currentWebView.profile === otrProfile
+                            onToggled: function(checked) {
+                                if (currentWebView) {
+                                    currentWebView.profile = checked ? otrProfile : defaultProfile;
+                                }
+                            }
+                        }
+                        MenuItem {
+                            id: httpDiskCacheEnabled
+                            text: "HTTP Disk Cache"
+                            checkable: currentWebView && !currentWebView.profile.offTheRecord
+                            checked: currentWebView && (currentWebView.profile.httpCacheType === WebEngineProfile.DiskHttpCache)
+                            onToggled: function(checked) {
+                                if (currentWebView) {
+                                    currentWebView.profile.httpCacheType = checked ? WebEngineProfile.DiskHttpCache : WebEngineProfile.MemoryHttpCache;
+                                }
+                            }
+                        }
+                        MenuItem {
+                            id: autoLoadIconsForPage
+                            text: "Icons On"
+                            checkable: true
+                            checked: WebEngine.settings.autoLoadIconsForPage
+                        }
+                        MenuItem {
+                            id: touchIconsEnabled
+                            text: "Touch Icons On"
+                            checkable: true
+                            checked: WebEngine.settings.touchIconsEnabled
+                            enabled: autoLoadIconsForPage.checked
+                        }
+                        MenuItem {
+                            id: webRTCPublicInterfacesOnly
+                            text: "WebRTC Public Interfaces Only"
+                            checkable: true
+                            checked: WebEngine.settings.webRTCPublicInterfacesOnly
+                        }
+                        MenuItem {
+                            id: devToolsEnabled
+                            text: "Open DevTools"
+                            checkable: true
+                            checked: false
+                        }
+                        MenuItem {
+                            id: pdfViewerEnabled
+                            text: "PDF viewer enabled"
+                            checkable: true
+                            checked: WebEngine.settings.pdfViewerEnabled
+                        }
+                    }
+                }
+            }
+            ProgressBar {
+                id: progressBar
+                height: 3
+                anchors {
+                    left: parent.left
+                    top: parent.bottom
+                    right: parent.right
+                    leftMargin: -parent.leftMargin
+                    rightMargin: -parent.rightMargin
+                }
+                style: ProgressBarStyle {
+                    background: Item {}
+                }
+                z: -2;
+                minimumValue: 0
+                maximumValue: 100
+                value: (currentWebView && currentWebView.loadProgress < 100) ? currentWebView.loadProgress : 0
+            }
+    }
+
+    TabView {
+        id: tabs
+        function createEmptyTab(profile) {
+            var tab = addTab("", tabComponent);
+            // We must do this first to make sure that tab.active gets set so that tab.item gets instantiated immediately.
+            tab.active = true;
+            tab.title = Qt.binding(function() { return tab.item.title ? tab.item.title : 'New Tab' });
+            tab.item.profile = profile;
+            return tab;
+        }
+
+        function indexOfView(view) {
+            for (let i = 0; i < tabs.count; ++i)
+                if (tabs.getTab(i).item == view)
+                    return i
+            return -1
+        }
+
+        function removeView(index) {
+            if (tabs.count > 1)
+                tabs.removeTab(index)
+            else
+                browserWindow.close();
+        }
+
+        anchors.top: parent.top
+        anchors.bottom: devToolsView.top
+        anchors.left: parent.left
+        anchors.right: parent.right
+        Component.onCompleted: createEmptyTab(defaultProfile)
+
+        // Add custom tab view style so we can customize the tabs to include a close button
+        style: TabViewStyle {
+            property color frameColor: "#999"
+            property color fillColor: "#eee"
+            property color nonSelectedColor: "#ddd"
+            frameOverlap: 1
+            frame: Rectangle {
+                color: "#eee"
+                border.color: frameColor
+            }
+            tab: Rectangle {
+                id: tabRectangle
+                color: styleData.selected ? fillColor : nonSelectedColor
+                border.width: 1
+                border.color: frameColor
+                implicitWidth: Math.max(text.width + 30, 80)
+                implicitHeight: Math.max(text.height + 10, 20)
+                Rectangle { height: 1 ; width: parent.width ; color: frameColor}
+                Rectangle { height: parent.height ; width: 1; color: frameColor}
+                Rectangle { x: parent.width - 2; height: parent.height ; width: 1; color: frameColor}
+                Text {
+                    id: text
+                    anchors.left: parent.left
+                    anchors.verticalCenter: parent.verticalCenter
+                    anchors.leftMargin: 6
+                    text: styleData.title
+                    elide: Text.ElideRight
+                    color: styleData.selected ? "black" : frameColor
+                }
+                Button {
+                    anchors.right: parent.right
+                    anchors.verticalCenter: parent.verticalCenter
+                    anchors.rightMargin: 4
+                    height: 12
+                    style: ButtonStyle {
+                        background: Rectangle {
+                            implicitWidth: 12
+                            implicitHeight: 12
+                            color: control.hovered ? "#ccc" : tabRectangle.color
+                            Text {text: "x" ; anchors.centerIn: parent ; color: "gray"}
+                        }}
+                    onClicked: tabs.removeView(styleData.index)
+                }
+            }
+        }
+
+        Component {
+            id: tabComponent
+            WebEngineView {
+                id: webEngineView
+                focus: true
+
+                onLinkHovered: function(hoveredUrl) {
+                    if (hoveredUrl == "")
+                        hideStatusText.start();
+                    else {
+                        statusText.text = hoveredUrl;
+                        statusBubble.visible = true;
+                        hideStatusText.stop();
+                    }
+                }
+
+                states: [
+                    State {
+                        name: "FullScreen"
+                        PropertyChanges {
+                            target: tabs
+                            frameVisible: false
+                            tabsVisible: false
+                        }
+                        PropertyChanges {
+                            target: navigationBar
+                            visible: false
+                        }
+                    }
+                ]
+                settings.autoLoadImages: appSettings.autoLoadImages
+                settings.javascriptEnabled: appSettings.javaScriptEnabled
+                settings.errorPageEnabled: appSettings.errorPageEnabled
+                settings.pluginsEnabled: appSettings.pluginsEnabled
+                settings.fullScreenSupportEnabled: appSettings.fullScreenSupportEnabled
+                settings.autoLoadIconsForPage: appSettings.autoLoadIconsForPage
+                settings.touchIconsEnabled: appSettings.touchIconsEnabled
+                settings.webRTCPublicInterfacesOnly: appSettings.webRTCPublicInterfacesOnly
+                settings.pdfViewerEnabled: appSettings.pdfViewerEnabled
+
+                onCertificateError: function(error) {
+                    error.defer();
+                    sslDialog.enqueue(error);
+                }
+
+                onNewViewRequested: function(request) {
+                    if (!request.userInitiated)
+                        print("Warning: Blocked a popup window.");
+                    else if (request.destination === WebEngineView.NewViewInTab) {
+                        var tab = tabs.createEmptyTab(currentWebView.profile);
+                        tabs.currentIndex = tabs.count - 1;
+                        request.openIn(tab.item);
+                    } else if (request.destination === WebEngineView.NewViewInBackgroundTab) {
+                        var backgroundTab = tabs.createEmptyTab(currentWebView.profile);
+                        request.openIn(backgroundTab.item);
+                    } else if (request.destination === WebEngineView.NewViewInDialog) {
+                        var dialog = applicationRoot.createDialog(currentWebView.profile);
+                        request.openIn(dialog.currentWebView);
+                    } else {
+                        var window = applicationRoot.createWindow(currentWebView.profile);
+                        request.openIn(window.currentWebView);
+                    }
+                }
+
+                onFullScreenRequested: function(request) {
+                    if (request.toggleOn) {
+                        webEngineView.state = "FullScreen";
+                        browserWindow.previousVisibility = browserWindow.visibility;
+                        browserWindow.showFullScreen();
+                        fullScreenNotification.show();
+                    } else {
+                        webEngineView.state = "";
+                        browserWindow.visibility = browserWindow.previousVisibility;
+                        fullScreenNotification.hide();
+                    }
+                    request.accept();
+                }
+
+                onQuotaRequested: function(request) {
+                    if (request.requestedSize <= 5 * 1024 * 1024)
+                        request.accept();
+                    else
+                        request.reject();
+                }
+
+                onRegisterProtocolHandlerRequested: function(request) {
+                    console.log("accepting registerProtocolHandler request for "
+                                + request.scheme + " from " + request.origin);
+                    request.accept();
+                }
+
+                onRenderProcessTerminated: function(terminationStatus, exitCode) {
+                    var status = "";
+                    switch (terminationStatus) {
+                    case WebEngineView.NormalTerminationStatus:
+                        status = "(normal exit)";
+                        break;
+                    case WebEngineView.AbnormalTerminationStatus:
+                        status = "(abnormal exit)";
+                        break;
+                    case WebEngineView.CrashedTerminationStatus:
+                        status = "(crashed)";
+                        break;
+                    case WebEngineView.KilledTerminationStatus:
+                        status = "(killed)";
+                        break;
+                    }
+
+                    print("Render process exited with code " + exitCode + " " + status);
+                    reloadTimer.running = true;
+                }
+
+                onWindowCloseRequested: tabs.removeView(tabs.indexOfView(webEngineView))
+
+                onSelectClientCertificate: function(selection) {
+                    selection.certificates[0].select();
+                }
+
+                onFindTextFinished: function(result) {
+                    if (!findBar.visible)
+                        findBar.visible = true;
+
+                    findBar.numberOfMatches = result.numberOfMatches;
+                    findBar.activeMatch = result.activeMatch;
+                }
+
+                onLoadingChanged: function(loadRequest) {
+                    if (loadRequest.status == WebEngineView.LoadStartedStatus)
+                        findBar.reset();
+                }
+
+                Timer {
+                    id: reloadTimer
+                    interval: 0
+                    running: false
+                    repeat: false
+                    onTriggered: currentWebView.reload()
+                }
+            }
+        }
+    }
+    WebEngineView {
+        id: devToolsView
+        visible: devToolsEnabled.checked
+        height: visible ? 400 : 0
+        inspectedView: visible && tabs.currentIndex < tabs.count ? tabs.getTab(tabs.currentIndex).item : null
+        anchors.left: parent.left
+        anchors.right: parent.right
+        anchors.bottom: parent.bottom
+        onNewViewRequested: function(request) {
+            var tab = tabs.createEmptyTab(currentWebView.profile);
+            tabs.currentIndex = tabs.count - 1;
+            request.openIn(tab.item);
+        }
+    }
+    MessageDialog {
+        id: sslDialog
+
+        property var certErrors: []
+        icon: StandardIcon.Warning
+        standardButtons: StandardButton.No | StandardButton.Yes
+        title: "Server's certificate not trusted"
+        text: "Do you wish to continue?"
+        detailedText: "If you wish so, you may continue with an unverified certificate. " +
+                      "Accepting an unverified certificate means " +
+                      "you may not be connected with the host you tried to connect to.\n" +
+                      "Do you wish to override the security check and continue?"
+        onYes: {
+            certErrors.shift().ignoreCertificateError();
+            presentError();
+        }
+        onNo: reject()
+        onRejected: reject()
+
+        function reject(){
+            certErrors.shift().rejectCertificate();
+            presentError();
+        }
+        function enqueue(error){
+            certErrors.push(error);
+            presentError();
+        }
+        function presentError(){
+            visible = certErrors.length > 0
+        }
+    }
+
+    FullScreenNotification {
+        id: fullScreenNotification
+    }
+
+    DownloadView {
+        id: downloadView
+        visible: false
+        anchors.fill: parent
+    }
+
+    function onDownloadRequested(download) {
+        downloadView.visible = true;
+        downloadView.append(download);
+        download.accept();
+    }
+
+    FindBar {
+        id: findBar
+        visible: false
+        anchors.right: parent.right
+        anchors.rightMargin: 10
+        anchors.top: parent.top
+
+        onFindNext: {
+            if (text)
+                currentWebView && currentWebView.findText(text);
+            else if (!visible)
+                visible = true;
+        }
+        onFindPrevious: {
+            if (text)
+                currentWebView && currentWebView.findText(text, WebEngineView.FindBackward);
+            else if (!visible)
+                visible = true;
+        }
+    }
+
+
+    Rectangle {
+        id: statusBubble
+        color: "oldlace"
+        property int padding: 8
+        visible: false
+
+        anchors.left: parent.left
+        anchors.bottom: parent.bottom
+        width: statusText.paintedWidth + padding
+        height: statusText.paintedHeight + padding
+
+        Text {
+            id: statusText
+            anchors.centerIn: statusBubble
+            elide: Qt.ElideMiddle
+
+            Timer {
+                id: hideStatusText
+                interval: 750
+                onTriggered: {
+                    statusText.text = "";
+                    statusBubble.visible = false;
+                }
+            }
+        }
+    }
+}
diff --git a/quicknanobrowser/DownloadView.qml b/quicknanobrowser/DownloadView.qml
new file mode 100644
index 0000000..e26c770
--- /dev/null
+++ b/quicknanobrowser/DownloadView.qml
@@ -0,0 +1,175 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+import QtWebEngine 1.9
+import QtQuick.Layouts 1.0
+
+Rectangle {
+    id: downloadView
+    color: "lightgray"
+
+    ListModel {
+        id: downloadModel
+        property var downloads: []
+    }
+
+    function append(download) {
+        downloadModel.append(download);
+        downloadModel.downloads.push(download);
+    }
+
+    Component {
+        id: downloadItemDelegate
+
+        Rectangle {
+            width: listView.width
+            height: childrenRect.height
+            anchors.margins: 10
+            radius: 3
+            color: "transparent"
+            border.color: "black"
+            Rectangle {
+                id: progressBar
+
+                property real progress: downloadModel.downloads[index]
+                                       ? downloadModel.downloads[index].receivedBytes / downloadModel.downloads[index].totalBytes : 0
+
+                radius: 3
+                color: width == listView.width ? "green" : "#2b74c7"
+                width: listView.width * progress
+                height: cancelButton.height
+
+                Behavior on width {
+                    SmoothedAnimation { duration: 100 }
+                }
+            }
+            Rectangle {
+                anchors {
+                    left: parent.left
+                    right: parent.right
+                    leftMargin: 20
+                }
+                Label {
+                    id: label
+                    text: downloadDirectory + "/" + downloadFileName
+                    anchors {
+                        verticalCenter: cancelButton.verticalCenter
+                        left: parent.left
+                        right: cancelButton.left
+                    }
+                }
+                Button {
+                    id: cancelButton
+                    anchors.right: parent.right
+                    iconSource: "icons/process-stop.png"
+                    onClicked: {
+                        var download = downloadModel.downloads[index];
+
+                        download.cancel();
+
+                        downloadModel.downloads = downloadModel.downloads.filter(function (el) {
+                            return el.id !== download.id;
+                        });
+                        downloadModel.remove(index);
+                    }
+                }
+            }
+        }
+
+    }
+    ListView {
+        id: listView
+        anchors {
+            topMargin: 10
+            top: parent.top
+            bottom: parent.bottom
+            horizontalCenter: parent.horizontalCenter
+        }
+        width: parent.width - 20
+        spacing: 5
+
+        model: downloadModel
+        delegate: downloadItemDelegate
+
+        Text {
+            visible: !listView.count
+            horizontalAlignment: Text.AlignHCenter
+            height: 30
+            anchors {
+                top: parent.top
+                left: parent.left
+                right: parent.right
+            }
+            font.pixelSize: 20
+            text: "No active downloads."
+        }
+
+        Rectangle {
+            color: "gray"
+            anchors {
+                bottom: parent.bottom
+                left: parent.left
+                right: parent.right
+            }
+            height: 30
+            Button {
+                id: okButton
+                text: "OK"
+                anchors.centerIn: parent
+                onClicked: {
+                    downloadView.visible = false;
+                }
+            }
+        }
+    }
+}
diff --git a/quicknanobrowser/FindBar.qml b/quicknanobrowser/FindBar.qml
new file mode 100644
index 0000000..de407ac
--- /dev/null
+++ b/quicknanobrowser/FindBar.qml
@@ -0,0 +1,146 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.5
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Layouts 1.0
+
+Rectangle {
+    id: root
+
+    property int numberOfMatches: 0
+    property int activeMatch: 0
+    property alias text: findTextField.text
+
+    function reset() {
+        numberOfMatches = 0;
+        activeMatch = 0;
+        visible = false;
+    }
+
+    signal findNext()
+    signal findPrevious()
+
+    width: 250
+    height: 35
+    radius: 2
+
+    border.width: 1
+    border.color: "black"
+    color: "white"
+
+    onVisibleChanged: {
+        if (visible)
+            findTextField.forceActiveFocus();
+    }
+
+
+    RowLayout {
+        anchors.fill: parent
+        anchors.topMargin: 5
+        anchors.bottomMargin: 5
+        anchors.leftMargin: 10
+        anchors.rightMargin: 10
+
+        spacing: 5
+
+        Rectangle {
+            Layout.fillWidth: true
+            Layout.fillHeight: true
+
+            TextField {
+                id: findTextField
+                anchors.fill: parent
+
+                style: TextFieldStyle {
+                    background: Rectangle {
+                        color: "transparent"
+                    }
+                }
+
+                onAccepted: root.findNext()
+                onTextChanged: root.findNext()
+                onActiveFocusChanged: activeFocus ? selectAll() : deselect()
+            }
+        }
+
+        Label {
+            text: activeMatch + "/" + numberOfMatches
+            visible: findTextField.text != ""
+        }
+
+        Rectangle {
+            border.width: 1
+            border.color: "#ddd"
+            width: 2
+            height: parent.height
+            anchors.topMargin: 5
+            anchors.bottomMargin: 5
+        }
+
+        ToolButton {
+            text: "<"
+            enabled: numberOfMatches > 0
+            onClicked: root.findPrevious()
+        }
+
+        ToolButton {
+            text: ">"
+            enabled: numberOfMatches > 0
+            onClicked: root.findNext()
+        }
+
+        ToolButton {
+            text: "x"
+            onClicked: root.visible = false
+        }
+    }
+}
diff --git a/quicknanobrowser/FullScreenNotification.qml b/quicknanobrowser/FullScreenNotification.qml
new file mode 100644
index 0000000..09305ba
--- /dev/null
+++ b/quicknanobrowser/FullScreenNotification.qml
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.5
+
+Rectangle {
+    id: fullScreenNotification
+    width: 500
+    height: 40
+    color: "white"
+    radius: 7
+
+    visible: false
+    opacity: 0
+
+    function show() {
+        visible = true;
+        opacity = 1;
+        reset.start();
+    }
+
+    function hide() {
+        reset.stop();
+        opacity = 0;
+    }
+
+    Behavior on opacity {
+        NumberAnimation {
+            duration: 750
+            onStopped: {
+                if (opacity == 0)
+                    visible = false;
+            }
+        }
+    }
+
+    Timer {
+        id: reset
+        interval: 5000
+        onTriggered: hide()
+    }
+
+    anchors.horizontalCenter: parent.horizontalCenter
+    y: 125
+
+    Text {
+        id: message
+        width: parent.width
+
+        anchors.horizontalCenter: parent.horizontalCenter
+        anchors.verticalCenter: parent.verticalCenter
+
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+
+        wrapMode: Text.WordWrap
+        elide: Text.ElideNone
+        clip: true
+
+        text: qsTr("You are now in fullscreen mode. Press ESC to quit!")
+    }
+}
diff --git a/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg b/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg
new file mode 100644
index 0000000..12693bb
--- /dev/null
+++ b/quicknanobrowser/doc/images/quicknanobrowser-demo.jpg
Binary files differ
diff --git a/quicknanobrowser/doc/src/quicknanobrowser.qdoc b/quicknanobrowser/doc/src/quicknanobrowser.qdoc
new file mode 100644
index 0000000..3188bb2
--- /dev/null
+++ b/quicknanobrowser/doc/src/quicknanobrowser.qdoc
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+    \example webengine/quicknanobrowser
+    \title WebEngine Quick Nano Browser
+    \ingroup webengine-examples
+    \brief A web browser implemented using the WebEngineView QML type.
+
+    \image quicknanobrowser-demo.jpg
+
+    \e {Quick Nano Browser} demonstrates how to use the \l{Qt WebEngine QML Types}
+    {Qt WebEngine QML types} to develop a small web browser application that consists of a browser
+    window with a title bar, toolbar, tab view, and status bar. The web content is loaded in a web
+    engine view within the tab view. If certificate errors occur, users are prompted for action in a
+    message dialog. The status bar pops up to display the URL of a hovered link.
+
+    A web page can issue a request for being displayed in fullscreen mode. Users can allow full
+    screen mode by using a toolbar button. They can leave fullscreen mode by using a keyboard
+    shortcut. Additional toolbar buttons enable moving backwards and forwards in the browser
+    history, reloading tab content, and opening a settings menu for enabling the following features:
+    JavaScript, plugins, fullscreen mode, off the record, HTTP disk cache, autoloading images, and
+    ignoring certificate errors.
+
+    \include examples-run.qdocinc
+
+    \section1 Creating the Main Browser Window
+
+    When the browser main window is loaded, it creates an empty tab using the default profile. Each
+    tab is a web engine view that fills the main window.
+
+    We create the main window in the \e BrowserWindow.qml file using the ApplicationWindow type:
+
+    \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml
+    \skipto ApplicationWindow
+    \printuntil currentWebView
+    \dots
+    \skipto width
+    \printuntil title
+
+    We use the TabView Qt Quick control to create an empty tab view that fills the main window. We
+    set the tab active first, to make sure that the tab item is immediately instantiated:
+
+    \skipto TabView
+    \printuntil Component.onCompleted
+
+    The tab contains a web engine view that loads web content:
+
+    \printuntil focus
+
+    We use the \l Action type to create new tabs:
+
+    \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml
+    \skipto reload
+    \skipto Action
+    \printuntil }
+
+    We use the \l TextField Qt Quick Control within a \l ToolBar to create an address bar that
+    shows the current URL and where users can enter another URL:
+
+    \skipto toolBar
+    \printuntil anchors.fill
+    \dots
+    \skipto TextField
+    \printuntil addressBar
+    \dots
+    \skipto focus
+    \printuntil /^\ {16}\}/
+
+    \section1 Handling Certificate Errors
+
+    If the certificate of the site being loaded triggers a certificate error, we call the
+    \l{WebEngineCertificateError::}{defer()} QML method to pause the URL request and wait for user
+    input:
+
+    \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml
+    \skipto onCertificateError
+    \printuntil }
+
+    We use the MessageDialog type to prompt users to continue or cancel the loading of the web page.
+    If users select \uicontrol Yes, we call the
+    \l{WebEngineCertificateError::}{ignoreCertificateError()} method to ignore the error and
+    continue loading content from the URL. If users select \uicontrol No, we call the
+    \l{WebEngineCertificateError::}{rejectCertificate()} method to reject the request and stop
+    loading content from the URL:
+
+    \skipto MessageDialog
+    \printuntil /^\ {4}\}/
+
+    \section1 Entering and Leaving Fullscreen Mode
+
+    We create a menu item for allowing fullscreen mode in a settings menu that we place on the tool
+    bar. Also, we create an action for leaving fullscreen mode by using a keyboard shortcut.
+    We call the \l{FullScreenRequest::}{accept()} method to accept the fullscreen request.
+    The methdod sets the \l{WebEngineView::}{isFullScreen} property to be equal to the
+    \l{FullScreenRequest::}{toggleOn} property.
+
+    \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml
+    \skipto onFullScreenRequested
+    \printuntil /^\ {16}\}/
+
+    When entering fullscreen mode, we display a notification using the FullScreenNotification custom
+    type that we create in \e FullScreenNotification.qml.
+
+    We use the \l Action type in the settings menu to create a shortcut for leaving fullscreen mode
+    by pressing the escape key:
+
+    \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml
+    \skipto Settings
+    \printuntil appSettings
+    \skipto fullScreenSupportEnabled
+    \printuntil Action
+    \skipto Escape
+    \printuntil /^\ {4}\}/
+
+    \section1 Files and Attributions
+
+    The example uses icons from the Tango Icon Library:
+
+    \table
+    \row
+        \li \l{quicknanobrowser-tango}{Tango Icon Library}
+        \li Public Domain
+    \endtable
+*/
diff --git a/quicknanobrowser/icons/3rdparty/COPYING b/quicknanobrowser/icons/3rdparty/COPYING
new file mode 100644
index 0000000..220881d
--- /dev/null
+++ b/quicknanobrowser/icons/3rdparty/COPYING
@@ -0,0 +1 @@
+The icons in this repository are herefore released into the Public Domain.
diff --git a/quicknanobrowser/icons/3rdparty/go-next.png b/quicknanobrowser/icons/3rdparty/go-next.png
new file mode 100644
index 0000000..6f3f65d
--- /dev/null
+++ b/quicknanobrowser/icons/3rdparty/go-next.png
Binary files differ
diff --git a/quicknanobrowser/icons/3rdparty/go-previous.png b/quicknanobrowser/icons/3rdparty/go-previous.png
new file mode 100644
index 0000000..93be3d1
--- /dev/null
+++ b/quicknanobrowser/icons/3rdparty/go-previous.png
Binary files differ
diff --git a/quicknanobrowser/icons/3rdparty/process-stop.png b/quicknanobrowser/icons/3rdparty/process-stop.png
new file mode 100644
index 0000000..b68290b
--- /dev/null
+++ b/quicknanobrowser/icons/3rdparty/process-stop.png
Binary files differ
diff --git a/quicknanobrowser/icons/3rdparty/qt_attribution.json b/quicknanobrowser/icons/3rdparty/qt_attribution.json
new file mode 100644
index 0000000..4e5a444
--- /dev/null
+++ b/quicknanobrowser/icons/3rdparty/qt_attribution.json
@@ -0,0 +1,24 @@
+{
+    "Id": "quicknanobrowser-tango",
+    "Name": "Tango Icon Library",
+    "QDocModule": "qtwebengine",
+    "QtUsage": "Used in WebEngine Quick Nano Browser example.",
+
+    "QtParts": [ "examples" ],
+    "Description": "Selected icons from the Tango Icon Library",
+    "Homepage": "http://tango.freedesktop.org/Tango_Icon_Library",
+    "Version": "0.8.90",
+    "DownloadLocation": "http://tango.freedesktop.org/releases/tango-icon-theme-0.8.90.tar.gz",
+    "LicenseId": "DocumentRef-PublicDomain",
+    "License": "Public Domain",
+    "LicenseFile": "COPYING",
+    "Copyright": "Ulisse Perusin <uli.peru@gmail.com>
+Steven Garrity <sgarrity@silverorange.com>
+Lapo Calamandrei <calamandrei@gmail.com>
+Ryan Collier <rcollier@novell.com>
+Rodney Dawes <dobey@novell.com>
+Andreas Nilsson <nisses.mail@home.se>
+Tuomas Kuosmanen <tigert@tigert.com>
+Garrett LeSage <garrett@novell.com>
+Jakub Steiner <jimmac@novell.com>"
+}
diff --git a/quicknanobrowser/icons/3rdparty/view-refresh.png b/quicknanobrowser/icons/3rdparty/view-refresh.png
new file mode 100644
index 0000000..cab4d02
--- /dev/null
+++ b/quicknanobrowser/icons/3rdparty/view-refresh.png
Binary files differ
diff --git a/quicknanobrowser/main.cpp b/quicknanobrowser/main.cpp
new file mode 100644
index 0000000..d09abba
--- /dev/null
+++ b/quicknanobrowser/main.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "utils.h"
+
+#ifndef QT_NO_WIDGETS
+#include <QtWidgets/QApplication>
+typedef QApplication Application;
+#else
+#include <QtGui/QGuiApplication>
+typedef QGuiApplication Application;
+#endif
+#include <QtQml/QQmlApplicationEngine>
+#include <QtQml/QQmlContext>
+#include <QtWebEngine/qtwebengineglobal.h>
+
+static QUrl startupUrl()
+{
+    QUrl ret;
+    QStringList args(qApp->arguments());
+    args.takeFirst();
+    for (const QString &arg : qAsConst(args)) {
+        if (arg.startsWith(QLatin1Char('-')))
+             continue;
+        ret = Utils::fromUserInput(arg);
+        if (ret.isValid())
+            return ret;
+    }
+    return QUrl(QStringLiteral("https://www.qt.io"));
+}
+
+int main(int argc, char **argv)
+{
+    QCoreApplication::setOrganizationName("QtExamples");
+    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+    QtWebEngine::initialize();
+
+    Application app(argc, argv);
+
+    QQmlApplicationEngine appEngine;
+    Utils utils;
+    appEngine.rootContext()->setContextProperty("utils", &utils);
+    appEngine.load(QUrl("qrc:/ApplicationRoot.qml"));
+    if (!appEngine.rootObjects().isEmpty())
+        QMetaObject::invokeMethod(appEngine.rootObjects().first(), "load", Q_ARG(QVariant, startupUrl()));
+    else
+        qFatal("Failed to load sources");
+
+    return app.exec();
+}
diff --git a/quicknanobrowser/quicknanobrowser.pro b/quicknanobrowser/quicknanobrowser.pro
new file mode 100644
index 0000000..922cf79
--- /dev/null
+++ b/quicknanobrowser/quicknanobrowser.pro
@@ -0,0 +1,25 @@
+requires(qtConfig(accessibility))
+
+TEMPLATE = app
+TARGET = quicknanobrowser
+
+HEADERS = utils.h
+SOURCES = main.cpp
+
+OTHER_FILES += ApplicationRoot.qml \
+               BrowserDialog.qml \
+               BrowserWindow.qml \
+               DownloadView.qml \
+               FindBar.qml \
+               FullScreenNotification.qml
+
+RESOURCES += resources.qrc
+
+QT += qml quick webengine
+
+qtHaveModule(widgets) {
+    QT += widgets # QApplication is required to get native styling with QtQuickControls
+}
+
+target.path = $$[QT_INSTALL_EXAMPLES]/webengine/quicknanobrowser
+INSTALLS += target
diff --git a/quicknanobrowser/quicknanobrowser.pro.user b/quicknanobrowser/quicknanobrowser.pro.user
new file mode 100644
index 0000000..8d2d930
--- /dev/null
+++ b/quicknanobrowser/quicknanobrowser.pro.user
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE QtCreatorProject>
+<!-- Written by QtCreator 11.0.2, 2024-09-25T11:54:14. -->
+<qtcreator>
+ <data>
+  <variable>EnvironmentId</variable>
+  <value type="QByteArray">{4fa440ca-08dc-4209-a92b-70ac9b95467e}</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.ActiveTarget</variable>
+  <value type="qlonglong">0</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.EditorSettings</variable>
+  <valuemap type="QVariantMap">
+   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
+   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
+    <value type="QString" key="language">Cpp</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
+    </valuemap>
+   </valuemap>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
+    <value type="QString" key="language">QmlJS</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
+    </valuemap>
+   </valuemap>
+   <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
+   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
+   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
+   <value type="int" key="EditorConfiguration.IndentSize">4</value>
+   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
+   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
+   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
+   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
+   <value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
+   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
+   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
+   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
+   <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
+   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
+   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
+   <value type="int" key="EditorConfiguration.TabSize">8</value>
+   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
+   <value type="bool" key="EditorConfiguration.UseIndenter">false</value>
+   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
+   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
+   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
+   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
+   <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
+   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
+   <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
+   <value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.PluginSettings</variable>
+  <valuemap type="QVariantMap">
+   <valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
+    <value type="bool" key="AutoTest.Framework.Boost">true</value>
+    <value type="bool" key="AutoTest.Framework.CTest">false</value>
+    <value type="bool" key="AutoTest.Framework.Catch">true</value>
+    <value type="bool" key="AutoTest.Framework.GTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtTest">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
+   <value type="int" key="AutoTest.RunAfterBuild">0</value>
+   <value type="bool" key="AutoTest.UseGlobal">true</value>
+   <valuemap type="QVariantMap" key="ClangTools">
+    <value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
+    <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
+    <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
+    <value type="int" key="ClangTools.ParallelJobs">12</value>
+    <value type="bool" key="ClangTools.PreferConfigFile">true</value>
+    <valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
+    <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
+    <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
+    <value type="bool" key="ClangTools.UseGlobalSettings">true</value>
+   </valuemap>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.0</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="DeviceType">Desktop</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 MSVC2019 32bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 MSVC2019 32bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.win32_msvc2019_kit</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Qt\Examples\Qt-5.15.2\webengine\build-quicknanobrowser-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Qt/Examples/Qt-5.15.2/webengine/build-quicknanobrowser-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Qt\Examples\Qt-5.15.2\webengine\build-quicknanobrowser-Desktop_Qt_5_15_2_MSVC2019_32bit-Release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Qt/Examples/Qt-5.15.2/webengine/build-quicknanobrowser-Desktop_Qt_5_15_2_MSVC2019_32bit-Release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Qt\Examples\Qt-5.15.2\webengine\build-quicknanobrowser-Desktop_Qt_5_15_2_MSVC2019_32bit-Profile</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Qt/Examples/Qt-5.15.2/webengine/build-quicknanobrowser-Desktop_Qt_5_15_2_MSVC2019_32bit-Profile</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">鏋勫缓</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">娓呴櫎</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+    <value type="int" key="SeparateDebugInfo">0</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">閮ㄧ讲</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">閮ㄧ讲</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
+    <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="CustomOutputParsers"/>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/Qt/Examples/Qt-5.15.2/webengine/quicknanobrowser/quicknanobrowser.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/Qt/Examples/Qt-5.15.2/webengine/quicknanobrowser/quicknanobrowser.pro</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/Qt/Examples/Qt-5.15.2/webengine/build-quicknanobrowser-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.TargetCount</variable>
+  <value type="qlonglong">1</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">22</value>
+ </data>
+ <data>
+  <variable>Version</variable>
+  <value type="int">22</value>
+ </data>
+</qtcreator>
diff --git a/quicknanobrowser/resources.qrc b/quicknanobrowser/resources.qrc
new file mode 100644
index 0000000..50ea05f
--- /dev/null
+++ b/quicknanobrowser/resources.qrc
@@ -0,0 +1,16 @@
+<!DOCTYPE RCC><RCC version="1.0">
+    <qresource prefix="/">
+        <file>ApplicationRoot.qml</file>
+        <file>BrowserDialog.qml</file>
+        <file>BrowserWindow.qml</file>
+        <file>DownloadView.qml</file>
+        <file>FindBar.qml</file>
+        <file>FullScreenNotification.qml</file>
+    </qresource>
+    <qresource prefix="icons">
+        <file alias="go-next.png">icons/3rdparty/go-next.png</file>
+        <file alias="go-previous.png">icons/3rdparty/go-previous.png</file>
+        <file alias="process-stop.png">icons/3rdparty/process-stop.png</file>
+        <file alias="view-refresh.png">icons/3rdparty/view-refresh.png</file>
+    </qresource>
+</RCC>
diff --git a/quicknanobrowser/utils.h b/quicknanobrowser/utils.h
new file mode 100644
index 0000000..79aa38c
--- /dev/null
+++ b/quicknanobrowser/utils.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of The Qt Company Ltd nor the names of its
+**     contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef UTILS_H
+#define UTILS_H
+
+#include <QtCore/QFileInfo>
+#include <QtCore/QUrl>
+
+class Utils : public QObject {
+    Q_OBJECT
+public:
+    Q_INVOKABLE static QUrl fromUserInput(const QString& userInput);
+};
+
+inline QUrl Utils::fromUserInput(const QString& userInput)
+{
+    QFileInfo fileInfo(userInput);
+    if (fileInfo.exists())
+        return QUrl::fromLocalFile(fileInfo.absoluteFilePath());
+    return QUrl::fromUserInput(userInput);
+}
+
+#endif // UTILS_H

--
Gitblit v1.9.1