Qt XML Viewer? (Как Блокнот ++)

0

У меня есть QDialog который содержит QTextBrowser, эта функция только для диалогов предназначена для отображения XML-документа в QTextBrowser. QDialog принимает std::string в качестве параметра, а затем использует QXmlStreamReader и QXmlStreamWriter преобразует эту строку в строку xml string, которая QTextBrowser а затем устанавливает эту строку в QTextBrowser в пользовательском интерфейсе.

Все это прекрасно работает, но в идеале я хотел бы иметь возможность нажимать на теги open/close и делать некоторые умные выделения, также иметь возможность сворачивать и расширять теги, в основном то, что им ищет, - это те же функции, что и [CN10 ] в режиме XML.

Im задается вопросом, знает ли кто-нибудь о каких-либо совместимых с Qt C++ библиотеках, которые выполняют это, или если в самом Qt есть что-то, что может иметь эту функциональность (хотя у меня был хороший внешний вид и не могу найти что-либо).

Примечание. Этот QTextBrowser просто отображает XML, который он настроен только для чтения, поэтому редактирование не требуется. Мне просто нужна эта функция только для просмотра (если это имеет значение)

Любые предложения приветствовали приветствия

Теги:
qt

2 ответа

2
Лучший ответ

Вы могли бы взглянуть на QScintilla, который должен быть достаточно мощным, но его единственным портом для Qt.

Или, например, QSyntaxHighlighter

1

Взгляните на эту страницу на примере того, как использовать QSyntaxHighlighter для отображения xml: http://www.yasinuludag.com/blog/?p=49

Вот повторная реализация QSyntaxHighlighter, которая выделяет xmls почти как notepad++

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);
        }
    }
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню