2014-11-12 5 views
0

У меня есть QDialog, который содержит QTextBrowser, эта функция только для диалогов - отображать XML-документ в QTextBrowser. QDialog принимает параметр std::string, а затем используя QXmlStreamReader и QXmlStreamWriter, он преобразует эту строку в строчную XML-строку «pretty print», а затем устанавливает эту строку в QTextBrowser в пользовательском интерфейсе.Qt XML Viewer? (Как Notepad ++)

Это все работает отлично, но в идеале я хотел бы иметь возможность нажимать на теги open/close и делать это с умными выделениями, также иметь возможность свернуть и развернуть теги, по сути, то, что они ищут, одинаково функциональность как Notepad ++ в режиме XML.

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

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

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

ответ

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