blob: ecdb1c818cb4492095fe6261bf2056db5c522a6b [file] [log] [blame]
/****************************************************************************
**
** 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 webenginewidgets/spellchecker
\title WebEngine Widgets Spellchecker Example
\ingroup webengine-widgetexamples
\brief Integrates a spellchecker into a simple HTML form.
\image spellchecker-example.png
\e {Spellchecker} demonstrates how to integrate spellchecking support into
an HTML form that enables users to submit spellchecked messages.
\include examples-run.qdocinc
\section1 Dictionaries
To be able to check the spelling, we need to provide the spellchecker with
dictionaries. The \QWE spellchecker supports dictionaries provided by the
\l {Hunspell project} on all platforms and native dictionaries provided by macOS.
In this example, we want to support the English and German languages.
For Hunspell dictionaries to be supported they have to be compiled into a special binary format.
A Hunspell dictionary consists of two files:
\list
\li A \c .dic file that is a dictionary containing words for the
language
\li An \c .aff file that defines the meaning of special flags in the
dictionary
\endlist
These two files can be converted into the \c bdic format by using the
\c qwebengine_convert_dict tool that is shipped together with Qt.
In this example, we are going to compile en_US and de_DE dictionaries.
However, the real full dictionaries would take too much space for the
purposes of this example. Therefore, we have created two dummy dictionaries
that contain the following words and can be used to demonstrate the
conversion process:
\list
\li English dictionary: I, you, he, she, it, we, they, love, loves, qt
\li German dictionary: ich, du, er, sie, es, wir, ihr, sie, Sie, liebe,
liebst, liebt, lieben, liebt, qt
\endlist
Each word in a dictionary can be prefixed with \c q. For more information
about how to create \c dic and \c aff files, see the Hunspell dictionary
file format specification in the \l{Hunspell Project}.
See the \l {Spellchecker}{Spellchecker feature documentation} for how
dictionary files are searched.
We specify the QMAKE_EXTRA_COMPILERS parameter in the project file to add a
conversion step to the build process:
\quotefromfile webenginewidgets/spellchecker/spellchecker.pro
\skipto CONVERT_TOOL
\printuntil QMAKE_EXTRA_COMPILERS
To set up a dictionary, we run \c qwebengine_convert_dict passing the
file path of the dictionary \c dic and \c bdic files. The \c aff file and
optional \c delta file are also picked up by the \c convert process.
The output \c bdic file is placed into the \e qtwebengine_dictionaries local
directory (or Resources directory), which the application binary will run from.
\section1 Setting the Spellchecker
The constructor of our class is trivial.
\quotefromfile webenginewidgets/spellchecker/webview.cpp
\skipto WebView::WebView
\printuntil }
We define simple mapping between our dictionary filenames and
the actual language display name. We will use that mapping to display names
of dictionaries in the context menu. Spellchecking is disabled by default.
Therefore we also enable spellchecker and set the \e English dictionary.
When \QWE's spellcheck service initializes, it will try to load the
\c bdict dictionaries and to check them for consistency.
Any errors are logged by using the qWarning() function.
\section1 Switching the Spellchecking Language
The current language used for spellchecking is defined per profile, and can
get set using the QWebEngineProfile::setSpellCheckLanguage method. When the
user clicks on an underlined misspelled word, the default context menu
displays up to four suggestions. Selecting one will replace the misspelled
word. We could reimplement a number of suggestions, by overriding
QWebEngineView::contextMenuEvent and using
QWebEngineContextMenuData::spellCheckerSuggestions, but we will demonstrate
how to add langague options in the context menu instead:
\quotefromfile webenginewidgets/spellchecker/webview.cpp
\skipto void WebView::contextMenuEvent
\printuntil menu->popup
\printline }
Above, we get the QWebEngineContextMenuData instance using the
QWebEnginePage::contextMenuData method. We use it to be notified when the
user clicks on an editable field and show the \uicontrol {Check Spelling}
item in the context menu. Moreover, if spellchecking is enabled, we also
add the \uicontrol {Select Language} submenu with the supported languages.
When an action is triggered, we set the language with the
QWebEngineProfile::setSpellCheckLanguage call.
*/