如何从组件 QTextDocument

问题描述

说明

我在 QML 中创建了一个 TextArea 组件,与 this 示例类似,我基于指向 QQuickTextDocument 的指针创建了一个 DocumentHandler 类,该指针通过 {{3 }} 财产。我需要这个以便能够格式化文本,即使其加粗、下划线、斜体、删除等。

我需要什么

我需要获取一个文本,其中格式化部分将显示为 HTML 标签。

例如粗体文本 最终我想采用 <b>Bold text</b> 的形式。或者例如 粗体和斜体文本 我想以 <b><i>Bold and italic text</i></b> 的形式获得(放置标签的顺序无关紧要)。>

我尝试了什么

我尝试使用 textDocument 函数,但该函数不适合我,因为:

  1. 它会生成很多我不需要的不必要的信息。例如,对于粗体,它返回以下结果:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p,li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Roboto'; font-size:14px; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Bold text</span></p></body></html>
  1. 我需要表示文本的常用标签(<b><i>等),这个函数以{{1}的style属性的形式构成} 标签。所以它用这一行改变了粗体:<span>

解决方法

说明

如果我理解正确,目前没有办法获得带有 HTML 标签的格式化文本,而没有由 QTextDocument 使用 toHtml() 函数生成的元信息。因此,我决定使用 QTextCursor 类手动完成这项工作。

代码

我有一个提供标签信息的结构:

struct Tag
{
    Tag(const QString& openTag,const QString& closeTag,const std::function<bool(const QTextCursor& cursor)>& canBeOpened);

    QString getOpenTag() const;
    QString getCloseTag() const;
    bool isOpened() const;
    bool isClosed() const;
    bool canBeOpened(const QTextCursor& cursor) const;
    void open();
    void close();

private:
    std::function<bool(const QTextCursor&)> m_canBeOpened;
    QString m_openTag;
    QString m_closeTag;
    bool m_isOpened{ false };
    bool m_isClosed{ true };
};

我有一个 std::vector 这样的结构,我初始化如下:

m_tags{ { "<b>","</b>",[](const QTextCursor& cursor) { return cursor.charFormat().fontWeight() == QFont::Bold; } },{ "<i>","</i>",[](const QTextCursor& cursor) { return cursor.charFormat().fontItalic(); } },{ "<u>","</u>",[](const QTextCursor& cursor) { return cursor.charFormat().fontUnderline(); } },{ "<s>","</s>",[](const QTextCursor& cursor) { return cursor.charFormat().fontStrikeOut(); } } }

最重要的是 getFormattedText() 函数,它使用 Tag 对象的这个向量来返回格式化文本。主要思想是在纯文本中手动放置标签,即开始标签放置在格式开始的位置,结束标签放置在它的结束位置。可以从 QTextCursor 类中获取有关文本中使用何种格式的信息,我们基于 QTextDocumentcan create。因此,我们有以下功能:

QString getFormattedText()
{
    QTextCursor cursor{ textCursor() };
    if (!cursor.isNull())
    {
        QString result{ cursor.document()->toPlainText() };
        for (int i{},offset{}; i < cursor.document()->characterCount(); ++i)
        {
            cursor.setPosition(i)
            for (auto& tag : m_tags)
            {
                if (tag.canBeOpened(cursor))
                {
                    if (!tag.isOpened())
                    {
                        result.insert(i - (i > 0 ? 1 : 0) + offset,tag.getOpenTag());
                        offset += tag.getOpenTag().size();
                        tag.open();
                    }
                }
                else if (!tag.isClosed())
                {
                    result.insert(i - (i > 0 ? 1 : 0) + offset,tag.getCloseTag());
                    offset += tag.getCloseTag().size();
                    tag.close();
                }
            }
        }
        for (int i = m_tags.size() - 1; i >= 0; --i)
        {
            if (!m_tags[i].isClosed())
            {
                result.insert(result.size(),m_tags[i].getCloseTag());
                m_tags[i].close();
            }
        }
        return result;
    }
    return {};
}

粗体和斜体文本看起来像这样<b><i>Bold and italic text</i></b>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...