Чтение онлайн

ЖАНРЫ

QT 4: программирование GUI на С++

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

Шрифт:

Давайте теперь посмотрим, как мы можем использовать класс 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, создают свои собственные высокоуровневые функции—оболочки для упрощения выполнения таких наиболее распространенных операций, как извлечение текста между открывающими и закрывающими тегами.

Запись документов XML

Существует два основных подхода к формированию файлов XML в приложениях Qt:

• мы можем построить дерево DOM и вызвать для него функцию save;

• мы можем сформировать файл XML вручную.

Выбор между этими подходами часто не зависит от типа используемого нами интерфейса для чтения документов XML: SAX или DOM.

Ниже приводится фрагмент программного кода, который иллюстрирует способ создания дерева DOM и его записи при помощи QTextStream:

const int Indent = 4;

QDomDocument doc;

QDomElement root = doc.createElement("doc");

QDomElement quote = doc.createElement("quote");

QDomElement translation = doc.createElement("translation");

QDomText latin = doc.createTextNode("Ars longa vita brevis");

QDomText english = doc.createTextNode("Art is long, life is short");

doc.appendChild(root);

root.appendChild(quote);

root.appendChild(translation);

quote.appendChild(latin);

translation.appendChild(english);

QTextStream out(&file);

doc.save(out, Indent);

Второй аргумент функции save задает размер отступа. При ненулевом его значении читаемость сформированного файла будет лучше. Ниже приводится полученный на выходе файл XML:

<doc>

....<quote>Ars longa vita brevis</quote>

....<translation>Art is long, life is short</translation>

</doc>

Порядок

действий будет другим, если в приложении дерево DOM используется в качестве главной структуры данных. В таких случаях приложения обычно считывают документы XML, применяя интерфейс DOM, затем модифицируют в памяти дерево DOM и, наконец, вызывают функцию save для обратного преобразования дерева в документ XML.

По умолчанию функция QDomDocument::save использует для генерации файла кодировку UTF-8. Мы можем применить другую кодировку, если добавить XML—объявление, например такое, как

<?xml version="1.0" encoding="ISO-8859-1"?>

в начало дерева DOM. Следующий фрагмент программного кода показывает, как это делать:

QTextStream out(&file);

QDomNode xmlNode = doc.createProcessingInstruction("xml",

"version=\"1.0\" encoding=\"ISO-8859-1\"");

doc.insertBefore(xmlNode, doc.firstChild);

doc.save(out, Indent);

Формирование файлов XML вручную выполняется не намного сложнее, чем при помощи DOM. Мы можем использовать QTextStream и писать строки, как мы бы делали с любым другим текстовым файлом. Наиболее сложным является вставка специальных символов в текст и значения атрибутов. Функция Qt::escape заменяет символы '<', '>' и '&'. Ниже приводится пример ее использования:

QTextStream out(&file);

out.setCodec("UTF-8");

out << "<doc>\n"

<< " <quote>" << Qt::escape(quoteText) << "</quote>\n"

<< " <translation>" << Qt::escape(translationText) << "</translation>\n"

<< "</doc>\n";

В статье «Generating XML» (Формирование документов XML) в журнале «Qt Quarterly», доступной в сети Интернет по адресурассматривается очень простой класс, позволяющий легко формировать файлы XML. Этот класс решает вопросы, связанные со специальными символами, отступами и кодировкой, позволяя нам полностью сконцентрироваться на документе XML, который мы собираемся формировать. Он предназначен для работы с Qt 3, но его очень легко перенести на Qt 4.

Глава 16. Обеспечение интерактивной помощи

Большинство приложений предоставляют своим пользователям систему помощи, работающую в интерактивном режиме. В некоторых случаях эта помощь носит форму коротких сообщений, например, в виде всплывающих подсказок, комментариев в строке состояния и справок «что это такое?». Все это, естественно, поддерживается в Qt. В других случаях система помощи может быть значительно сложнее и может содержать много страниц текста. Для такого рода систем вы можете воспользоваться классом QTextBrowser в качестве простого браузера системы помощи, а также вы можете вызывать из вашего приложения Qt Assistant или другой браузер файлов HTML.

Поделиться с друзьями: