Qt XML查看器?(类似于Notepad++)
Qt XML Viewer? (Like Notepad++)
我有一个包含QTextBrowser
的QDialog
,这个对话框的唯一功能是在QTextBrowser
中显示XML文档。QDialog
将std::string
作为参数,然后使用QXmlStreamReader
和QXmlStreamWriter
将该字符串转换为"漂亮打印"格式的xml字符串,然后在UI上将该字符串设置为QTextBrowser
。
这一切都很好,但理想情况下,我希望能够点击打开/关闭标签,并让它进行一些巧妙的高亮显示,还能够折叠和展开标签,本质上,我想要的是在XML模式下与Notepad++相同的功能。
我想知道是否有人知道有任何Qt C++兼容库可以实现这一功能,或者Qt本身是否有任何东西可以具有这一功能(尽管我仔细查看了一下,但找不到任何东西)。
注意:这个QTextBrowser
只是显示它被设置为只读的XML,所以不需要编辑它。我只需要这个功能来查看(如果有区别的话)
欢迎任何建议欢呼
您可以看看QScintilla,它应该非常强大,但它只是Qt的一个端口。
或者例如QSyntaxHighlighter
查看此页面,了解如何使用QSyntaxHighlighter显示xml的示例:http://www.yasinuludag.com/blog/?p=49
这里是QSyntaxHighlighter的重新实现,它突出显示xml,就像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);
}
}
};
相关文章:
- 类似于strcat()的函数出现问题
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 算术运算的结果类似于:C浮点变量中的1/3
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 创建类似于布尔值的变量类型
- 如何在 Arduino 字符串的开头添加元素.类似于 JS unshift();
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- 如何创建类似于 QVariant 的变体类
- 对于多个字符(如 ETX/STX 对),是否有类似于 std::quote 的东西
- 初始化命名空间中的变量是否类似于将它们初始化为类成员?
- C++中用于结构的纯数组的类似于TableView/DataFrame的通用功能
- 有没有类似于stoi的函数可以用于模板类
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 序列化模式类似于boost::序列化
- 构造一个类似于JSON文件c++的字符串
- 多重继承中的派生类的行为类似于聚合
- 如何使更安全的C++变体访问者,类似于切换语句?
- C++ Python 中是否有类似于 help() 的函数
- Qt XML查看器?(类似于Notepad++)