Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

01 void DomParser::parseEntry(const QDomElement &element,

02 QTreeWidgetItem *parent)

03 {

04 QTreeWidgetItem *item;

05 if (parent) {

06 item = new QTreeWidgetTtem(parent);

07 } else {

08 item = new QTreeWidgetItem(treeWidget);

09 }

10 item->setText(0, element.attribute("term"));

11 QDomNode node = element.firstChild;

12 while (!node.isNull) {

13 if (node.toElement.tagName == "entry") {

14 parseEntry(node.toElement, item);

15 } else if (node.toElement.tagName == "page") {

16 QDomNode childNode = node.firstChild;

17 while (!childNode.isNull) {

18 if (childNode.nodeType == QDomNode::TextNode) {

19 QString page = childNode.toText.data;

20 QString allPages = item->text(1);

21 if (!allPages.isEmpty)

22 allPages += ", ";

23 allPages += page;

24 item->setText(1, allPages);

25 break;

26 }

27 childNode = childNode.nextSibling;

28 }

29 }

30 node = node.nextSibling;

31 }

32 }

В функции parseEntry мы создаем элемент объекта QTreeWidget. Если тег вложен в другой <entry>, новый тег определяет подэлемент предметного указателя, и мы создаем элемент QTreeWidgetItem как дочерний для внешнего элемента QTreeWidgetItem. В противном случае мы создаем элемент QTreeWidgetItem с treeWidget в качестве его родительского элемента, делая его элементом верхнего уровня. Мы вызываем функцию setText для установки текста столбца 0 на значение атрибута term тега <entry>.

После инициализации нами элемента QTreeWidgetItem мы выполняем цикл по дочерним узлам элемента QDomElement, который соответствует текущему тегу <entry>.

Если элементом является <entry>, мы вызываем функцию parseEntry, передавая текущий элемент в качестве второго аргумента. Затем будет создан новый элемент QTreeWidgetItem, в качестве родительского элемента которого выступает внешний элемент QTreeWidgetItem.

Если элементом является <page>, мы просматриваем список дочерних элементов для поиска узла Text. После его обнаружения мы вызываем функцию toText для преобразования его в объект типа QDomText и функцию data для получения текста в виде строки типа QString. Затем мы добавляем текст в разделяемый запятыми список номеров страниц в столбце 1 элемента QTreeWidgetItem.

Давайте теперь посмотрим, как мы можем использовать класс DomParser для синтаксического анализа файла:

01 void parseFile(const QString &fileName)

02 {

03 QStringList labels;

04 labels << QObject::tr("Terms") << QObject::tr("Pages");

05 QTreeWidget *treeWidget = new QTreeWidget;

06 treeWidget->setHeaderLabels(labels);

07 treeWidget->setWindowTitle(QObject::tr("DOM Parser"));

08 treeWidget->show;

09 QFile file(fileName);

10 DomParser(&file, treeWidget);

11 }

Мы начинаем с настройки QTreeWidget. Затем мы создаем объекты QFile и DomParser. При выполнении конструктора DomParser осуществляется синтаксический анализ файла и пополняется виджет дерева.

Как и в предыдущем примере, для сборки приложения с библиотекой QtXml в файл .pro необходимо добавить следующую строку:

QT += xml

Как показывает наш пример, проход по дереву DOM может быть достаточно непростым делом. Простая операция по извлечению текста между тегами <page> и </page> требует обработки в цикле элементов списка при помощи функций firstChild и nextSibling класса QDomNode. Программисты, которым очень часто приходится использовать интерфейс DOM, создают свои собственные высокоуровневые функции—оболочки для упрощения выполнения таких наиболее распространенных операций, как извлечение текста между открывающими и закрывающими тегами.

  • Читать дальше
  • 1
  • ...
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: