繁体   English   中英

Qt XML Viewer? (如记事本++)

[英]Qt XML Viewer? (Like Notepad++)

我有一个包含QTextBrowserQDialog ,此对话框的唯一功能是在QTextBrowser显示XML文档。 QDialogstd::string作为参数,然后使用QXmlStreamReaderQXmlStreamWriter将该字符串转换为“漂亮打印”格式的xml字符串,然后将该字符串设置为UI上的QTextBrowser

一切正常,但理想情况下,我希望能够单击打开/关闭标签并进行一些巧妙的突出显示,还能够折叠和展开标签,本质上,我在寻找的功能与Notepad ++相同在XML模式下。

我想知道是否有人知道可以完成此操作的所有Qt C ++兼容库,或者Qt本身是否具有此功能(尽管我看上去很漂亮,找不到任何东西)。

注意:此QTextBrowser只是显示XML,并将其设置为只读,因此无需进行编辑,我只需要此功能即可查看(如果有所不同)

任何建议都欢迎欢呼

您可以看看QScintilla ,它应该非常强大,但是它只是通向Qt的端口。

或例如QSyntaxHighlighter

请看此页面上有关如何使用QSyntaxHighlighter显示xml的示例: http : //www.yasinuludag.com/blog/?p=49

这是QSyntaxHighlighter的重新实现,它几乎像notepad ++一样突出显示xml。

class XMLHighlighter : public QSyntaxHighlighter
{
public:
    XMLHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent) {
        HighlightingRule rule;

        // >text<
        QTextCharFormat xmlValueElementFormat;
        xmlValueElementFormat.setForeground(Qt::black);
        xmlValueElementFormat.setFontWeight(QFont::Bold);
        rule.pattern = QRegExp(">[^\n]*<");
        rule.format = xmlValueElementFormat;
        highlightingRules.append(rule);

        // keywords
        QTextCharFormat keywordFormat;
        keywordFormat.setForeground(Qt::blue);
        keywordFormat.setFontWeight(QFont::Bold);
        QStringList keywords;
        keywords << "\\b?xml\\b" << "/>" << ">" << "<";
        foreach (const QString &keyword, keywords) {
            rule.pattern = QRegExp(keyword);
            rule.format = keywordFormat;
            highlightingRules.append(rule);
        }

        // <Text> </Text>
        QTextCharFormat xmlElementFormat;
        xmlElementFormat.setForeground(Qt::blue);
        rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=[\/>])");
        rule.format = xmlElementFormat;
        highlightingRules.append(rule);

        // < Text= >
        QTextCharFormat xmlAttributeFormat;
        xmlAttributeFormat.setForeground(Qt::red);
        rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\=)");
        rule.format = xmlAttributeFormat;
        highlightingRules.append(rule);

        // <!-- Text -->
        QTextCharFormat singleLineCommentFormat;
        singleLineCommentFormat.setForeground(Qt::gray);
        rule.pattern = QRegExp("<!--[^\n]*-->");
        rule.format = singleLineCommentFormat;
        highlightingRules.append(rule);

        // = "Text"
        QColor valueColor(128, 0, 255);
        valueFormat.setForeground(valueColor);
        valueFormat.setFontWeight(QFont::Bold);
        valueStartExpression.setPattern("\"");
        valueEndExpression.setPattern("\"(?=[\s></])");
    }

    virtual ~XMLHighlighter() {
    }

private:
    struct HighlightingRule
    {
        QRegExp pattern;
        QTextCharFormat format;
    };
    QVector<HighlightingRule> highlightingRules;

    QTextCharFormat valueFormat;
    QRegExp valueStartExpression;
    QRegExp valueEndExpression;

    void highlightBlock(const QString & text)
    {
        //for every pattern
        foreach (const HighlightingRule &rule, highlightingRules)
        {
            QRegExp expression(rule.pattern);
            int index = expression.indexIn(text);

            while(index >= 0) {
                int length = expression.matchedLength();
                this->setFormat(index, length, rule.format);
                index = expression.indexIn(text, index + length);
            }
        }

        this->setCurrentBlockState(0);
        int startIndex = 0;

        if(this->previousBlockState() != 1)
            startIndex = valueStartExpression.indexIn(text);

        while(startIndex >= 0)
        {
            int endIndex = valueEndExpression.indexIn(text, startIndex);
            int commentLength;

            if (endIndex == -1) {
                this->setCurrentBlockState(1);
                commentLength = text.length() - startIndex;
            }
            else {
                commentLength = endIndex - startIndex + valueEndExpression.matchedLength();
            }

            this->setFormat(startIndex, commentLength, valueFormat);
            startIndex = valueStartExpression.indexIn(text, startIndex + commentLength);
        }
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM