WebEngine Widgets 拼写检查器示例

将拼写检查器集成到简单的 HTML 表单中。

拼写检查器演示了如何将拼写检查支持集成到 HTML 表单中,使用户可以提交已检查的短信。

运行示例

要从 Qt Creator 运行示例,请打开 欢迎 模式并从中选择示例 示例。有关更多信息,请参阅 构建和运行示例

词典

要能够进行拼写检查,我们需要向拼写检查器提供词典。Qt WebEngine 拼写检查器支持所有平台上由 Hunspell 项目提供的词典和在 macOS 上提供的本地词典。在这个例子中,我们希望支持英语和德语。

要支持 Hunspell 词典,它们必须编译成一种特殊的二进制格式。Hunspell 词典由两个文件组成

  • .dic 文件,它包含该语言单词的词典
  • .aff 文件,它定义词典中特殊标志的含义

这两个文件可以通过使用 Qt 一起提供的 qwebengine_convert_dict 工具转换为 bdic 格式。

在这个例子中,我们将编译 en_US 和 de_DE 词典。然而,真实的完整词典对于这个示例来说会占用太多空间。因此,我们创建了两个占位符词典,包含以下单词,并可用于演示转换过程

  • 英语词典:I,you,he,she,it,we,they,love,loves,qt
  • 德语词典:ich,du,er,sie,es,wir,ihr,sie,Sie,liebe,liebst,liebt,lieben,liebt,qt

词典中的每个单词都可以用 q 前缀。有关如何创建 dicaff 文件的更多信息,请参阅 Hunspell 项目 中 Hunspell 词典文件格式规范。

有关词典文件的搜索方法,请参见 拼写检查器功能文档

我们在项目文件中指定 QMAKE_EXTRA_COMPILERS 参数以将一个转换步骤添加到构建过程中

qtPrepareTool(CONVERT_TOOL, qwebengine_convert_dict, "", "", $$[QT_INSTALL_LIBEXECS])

debug_and_release {
    CONFIG(debug, debug|release): DICTIONARIES_DIR = debug/qtwebengine_dictionaries
    else: DICTIONARIES_DIR = release/qtwebengine_dictionaries
} else {
    DICTIONARIES_DIR = qtwebengine_dictionaries
}

dict_base_paths = en/en-US de/de-DE
for (base_path, dict_base_paths) {
    dict.files += $$PWD/dict/$${base_path}.dic
}

dictoolbuild.input = dict.files
dictoolbuild.output = $${DICTIONARIES_DIR}/${QMAKE_FILE_BASE}.bdic
dictoolbuild.depends = ${QMAKE_FILE_PATH}/${QMAKE_FILE_BASE}.aff
dictoolbuild.commands = $${CONVERT_TOOL} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
dictoolbuild.name = Build ${QMAKE_FILE_IN_BASE}
dictoolbuild.CONFIG = no_link target_predeps
QMAKE_EXTRA_COMPILERS += dictoolbuild

要设置字典,我们运行 qwebengine_convert_dict,传入字典文件的路径dicbdic 文件。 aff 文件和可选的 delta 文件也会被 convert 过程获取。输出的 bdic 文件将放置在 qtwebengine_dictionaries 本地目录(或资源目录)中,应用程序的二进制文件将从该目录运行。

设置拼写检查

我们类的构造函数很简单。

WebView::WebView(QWidget *parent)
    : QWebEngineView(parent)
{
    m_spellCheckLanguages["English"] = "en-US";
    m_spellCheckLanguages["German"] = "de-DE";
    QWebEngineProfile *profile = page()->profile();
    profile->setSpellCheckEnabled(true);
    profile->setSpellCheckLanguages({"en-US"});

我们定义了字典文件名和实际语言显示名称之间的简单映射。我们将使用这个映射来显示上下文菜单中的字典名称。默认情况下禁用拼写检查。因此,我们还启用拼写检查并设置英语字典。当 Qt WebEngine 的拼写检查服务初始化时,它将尝试加载bdict 字典并检查它们的一致性。任何错误都通过使用qWarning() 函数记录。

切换拼写检查语言

用于拼写检查的当前语言是按配置文件定义的,可以使用 QWebEngineProfile::setSpellCheckLanguage 方法设置。当用户点击下划线的拼写错误单词时,默认上下文菜单将显示最多四个建议。选择一个将会替换拼写错误的单词。我们可以通过对QWebEngineView::contextMenuEvent 进行重写并使用 QWebEngineContextMenuData::spellCheckerSuggestions 来执行多个建议的重新实现,但我们将演示如何在上下文菜单中添加语言选项。

void WebView::contextMenuEvent(QContextMenuEvent *event)
{
    QWebEngineContextMenuRequest *data = lastContextMenuRequest();
    Q_ASSERT(data);

    if (!data->isContentEditable()) {
        QWebEngineView::contextMenuEvent(event);
        return;
    }

    QWebEngineProfile *profile = page()->profile();
    const QStringList &languages = profile->spellCheckLanguages();
    QMenu *menu = createStandardContextMenu();
    menu->addSeparator();

    QAction *spellcheckAction = new QAction(tr("Check Spelling"), nullptr);
    spellcheckAction->setCheckable(true);
    spellcheckAction->setChecked(profile->isSpellCheckEnabled());
    connect(spellcheckAction, &QAction::toggled, this, [profile](bool toogled) {
        profile->setSpellCheckEnabled(toogled);
    });
    menu->addAction(spellcheckAction);

    if (profile->isSpellCheckEnabled()) {
        QMenu *subMenu = menu->addMenu(tr("Select Language"));
        const QStringList keys = m_spellCheckLanguages.keys();
        for (const QString &str : keys) {
            QAction *action = subMenu->addAction(str);
            action->setCheckable(true);
            QString lang = m_spellCheckLanguages[str];
            action->setChecked(languages.contains(lang));
            connect(action, &QAction::triggered, this, [profile, lang](){
               profile->setSpellCheckLanguages(QStringList()<<lang);
            });
        }
    }
    connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater);
    menu->popup(event->globalPos());
}

如上所示,我们通过 QWebEnginePage::contextMenuData 方法获取 QWebEngineContextMenuData 实例。我们使用它来在用户点击可编辑字段时接收通知,并在上下文菜单中显示检查拼写项。此外,如果启用拼写检查,我们还会添加包含支持语言的选择语言子菜单。当触发动作时,我们使用 QWebEngineProfile::setSpellCheckLanguage 调用来设置语言。

示例项目 @ code.qt.io

© 2024 The Qt Company Ltd。包含在内的文档贡献是各自所有者的版权。本报告中提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款许可的。Qt及其相关标志是芬兰和/或全球其他国家的The Qt Company Ltd的商标。所有其他商标均为各自所有者的财产。