[英]Qt XML Viewer? (Like Notepad++)
我有一个包含QTextBrowser
的QDialog
,此对话框的唯一功能是在QTextBrowser
显示XML文档。 QDialog
将std::string
作为参数,然后使用QXmlStreamReader
和QXmlStreamWriter
将该字符串转换为“漂亮打印”格式的xml字符串,然后将该字符串设置为UI上的QTextBrowser
。
一切正常,但理想情况下,我希望能够单击打开/关闭标签并进行一些巧妙的突出显示,还能够折叠和展开标签,本质上,我在寻找的功能与Notepad ++相同在XML模式下。
我想知道是否有人知道可以完成此操作的所有Qt C ++兼容库,或者Qt本身是否具有此功能(尽管我看上去很漂亮,找不到任何东西)。
注意:此QTextBrowser
只是显示XML,并将其设置为只读,因此无需进行编辑,我只需要此功能即可查看(如果有所不同)
任何建议都欢迎欢呼
您可以看看QScintilla ,它应该非常强大,但是它只是通向Qt的端口。
请看此页面上有关如何使用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.