У меня есть QDialog
который содержит QTextBrowser
, эта функция только для диалогов предназначена для отображения XML-документа в QTextBrowser
. QDialog
принимает std::string
в качестве параметра, а затем использует QXmlStreamReader
и QXmlStreamWriter
преобразует эту строку в строку xml string, которая QTextBrowser
а затем устанавливает эту строку в QTextBrowser
в пользовательском интерфейсе.
Все это прекрасно работает, но в идеале я хотел бы иметь возможность нажимать на теги open/close и делать некоторые умные выделения, также иметь возможность сворачивать и расширять теги, в основном то, что им ищет, - это те же функции, что и [CN10 ] в режиме XML.
Im задается вопросом, знает ли кто-нибудь о каких-либо совместимых с Qt C++ библиотеках, которые выполняют это, или если в самом Qt есть что-то, что может иметь эту функциональность (хотя у меня был хороший внешний вид и не могу найти что-либо).
Примечание. Этот QTextBrowser
просто отображает XML, который он настроен только для чтения, поэтому редактирование не требуется. Мне просто нужна эта функция только для просмотра (если это имеет значение)
Любые предложения приветствовали приветствия
Вы могли бы взглянуть на QScintilla, который должен быть достаточно мощным, но его единственным портом для Qt.
Или, например, QSyntaxHighlighter
Взгляните на эту страницу на примере того, как использовать 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);
}
}
};