Qt:Документация 4.3.2/qt4-scribe

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
40px Внимание: Актуальная версия перевода документации находится здесь

__NOTOC__

Image:qt-logo.png

Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

Image:trolltech-logo.png

[Предыдущая: Система рисования Arthur ] [ Начало ] [Следующая: Классы главного окна в Qt 4 ]

Содержание

[править] Классы работы с текстом Scribe

Scribe предоставляет набор классов Qt 4 для размещения текста. Эти классы заменяют мощный текстовый движок Qt 3 и предоставляют новые возомжности обработки и размещения простого и форматированного текста.

Для более детального ознакомления с классами Scribe смотрите документ Обработка форматированного текста.

[править] Обзор Scribe

Поддержка отображения и компоновки текста с Qt 4 была перепроектирована с использованием системы, позволяющей осуществлять эти действия более гибко, чем в Qt 3. Qt 4 также предоставляет более удобный интерфейс для программирования изменения документов. Эти усовершенствования были достигнуты с помощью переработки системы отрисовки текста и предоставления нескольких новых классов.

Далее следует краткий обзор основных концепций Scribe.

[править] Интерфейс документа

Текстовые документы скорее представлены классом QTextDocument, чем набором объектов QString. Каждый объект QTextDocument содержит информацию о внутреннем представлении документа, его структуре и отслеживает последовательность модификаций для поддержки возможностей отмены/повторения. Данный подход позволяет делегировать управление компоновкой классам-наследникам при сохранении централизованного управления в одном классе.

Документы могут быть конвертированы из внешних источников или созданы на пустом месте с использованием Qt. Создание документа может быть осуществлено с помощью виджета-редактора, такого как QTextEdit, или с помощью вызова API Scribe.

К текстовым документам можно обращаться двумя взаимодополняющими способами: как к линейному буферу (для редактирования и использования) и как к иерархической структуре (для управления компоновкой). В иерархической модели документа объекты, как правило, соответствуют визуальным элементам типа рамок, таблиц и списков. На низовом уровне эти элементы описывают такие атрибуты текста, как стиль и выравнивание. Линейное представление используется для редактирования и манипуляции содержимым документа.

[править] Структура документа

Каждый документ содержит корневую структуру в которую помещены все элементы. Коневая структура содержит такие структурные элементы как таблицы, блоки текста и т.д., которые могут иметь произовольную глубину вложения.

Структура не только представляет логическую организацию документа, но и содержит свойтсва, влияющие на отрисовку текста. Таблица - это специализированный элемент, состоящий из ячеек расположенных в виде строк и столбцов и содержащих структуры более низкого уровня или текст. Таблицы обеспечивают управление расположением с помощью создания гибких конфигураций ячеек.

Текстовые блоки содержат сам текст и признаки его форматирования. Свойста текста можно задавать как для символа, так и для блока целиком. На уровне символа могут быть определены такие свойства как начертание и размер шрифта, а также цвет символов. Свойства текстового блока управляют более глобальными особенностями текста, такими как: выравнивание текста, его направления и фонового цвета.

Структура документа не имеет непосредственного управления. Управление производится через интерфейс на основе курсоров.

[править] Создание содержимого документа и его редактирование

Документы могут быть отредактированы через интерфейс предоставленный классом QTextCursor, курсоров, созданы с при помощи конструкторов или получены от виджетов-редакторов. Курсор используется для выполнения таких действий по редактированию, которые пользователь осуществляет сам, работая в редакторе. В результате информация о структуре документа также становится доступна и может быть изменена. Использование интерфейса ориентированного на курсор делает более простым процесс отображения пользовательского текста, так как он (процесс) может быть легко визуализирован.

Класс QTextCursor также содержит информацию о выделенном в документе тексте и поддерживает возможности работы с выделенным текстом подобно возможностям работы пользователя в текстовом редакторе.

[править] Компоновка документа

Управление компоновкой уместно лишь когда документ должен быть отображен на некотором устройстве или когда требуются некоторые сведения для визуализации информации о документе. Пока этого не происходит, документ не может быть отформатирован и подготовлен для отображения.

Компоновкой каждого документа управляет подкласс QAbstractTextDocumentLayout. Этот класс предоставляет общий интерфейс для движков компоновки и отображения. По умолчанию процесс отрисовки реализован в частном классе. Такой подход делает возможным создание собственных компоновщиков и предоставляет механизм, используемый при подготовки страниц для печати или экспорта в файлы Portable Document Format (PDF).

[править] Примеры кода

Здесь представлены два способа, использования Scribe: для создания и манипулирования форматированным текстом и для размещения простого текста.

[править] Управление форматированным текстом

Манипулирование форматированным текстом Форматированный текст хранится в текстовых документах, которые могут быть созданы импортированием HTML из внешних источников или созданы с помощью QTextCursor. Самый легкий способ использования форматированного текстового документа - это использование класса QTextEdit, обеспечивающего отображение и возможность редактирования документа. Код, приведённый ниже, импортирует документ HTML в текстовый документ и отображает текстовый документ в виджете, позволяющем редактировать текст.

     QTextEdit *editor = new QTextEdit(parent);
     editor->setHtml(aStringContainingHTMLtext);
     editor->show();

Вы можете получить указатель на текстовый документ от тестового редактора с помощью функции document(). После этого документ можно изменить программно, используя класс QTextCursor. Этот класс работает по принципу экранного курсора, а операции редактирования отображаются на экране. Следующий код изменяет начертание шрифта первой строки на полужирное, оставляя все другие характеристики нетронутыми. Редактор автоматически обновится для отображения сделанных изменений.

     QTextDocument *document = edit->document();
     QTextCursor cursor(document);
 
     cursor.movePosition(QTextCursor::Start);
     cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
 
     QTextCharFormat format;
     format.setFontWeight(QFont::Bold);
 
     cursor.mergeCharFormat(format);

Обратите внимание на то, что курсор был перемещен от начала линии к концу и при этом сохранилась привязка к началу линии. Это показывает средства для работы с классом QTextCursor.

Используя подход на основе курсора, можно очень быстро создать форматированный текст. Следующий пример отображает календарь в виджете QTextEdit с полужирными заголовками дней недели:

     editor = new QTextEdit(this);
 
     QTextCursor cursor(editor->textCursor());
     cursor.movePosition(QTextCursor::Start);
 
     QTextCharFormat format(cursor.charFormat());
     format.setFontFamily("Courier");
 
     QTextCharFormat boldFormat = format;
     boldFormat.setFontWeight(QFont::Bold);
 
     cursor.insertBlock();
     cursor.insertText(" ", boldFormat);
 
     QDate date = QDate::currentDate();
     int year = date.year(), month = date.month();
 
     for (int weekDay = 1; weekDay <= 7; ++weekDay) {
         cursor.insertText(QString("%1 ").arg(QDate::shortDayName(weekDay), 3),
             boldFormat);
     }
 
     cursor.insertBlock();
     cursor.insertText(" ", format);
 
     for (int column = 1; column < QDate(year, month, 1).dayOfWeek(); ++column) {
         cursor.insertText("    ", format);
     }
 
     for (int day = 1; day <= date.daysInMonth(); ++day) {
         int weekDay = QDate(year, month, day).dayOfWeek();
 
         if (QDate(year, month, day) == date)
             cursor.insertText(QString("%1 ").arg(day, 3), boldFormat);
         else
             cursor.insertText(QString("%1 ").arg(day, 3), format);
 
         if (weekDay == 7) {
             cursor.insertBlock();
             cursor.insertText(" ", format);
         }
     }

Вышеприведенный пример демонстрирует, насколько просто создается форматированный текст и как мало для этого нужно кодировать. Хотя для минимизации кода мы отобразили простой неизменный календарь, Scribe предоставляет возможности более сложной компоновки и форматирования текста.

[править] Выравнивание простого текста

Иногда важно иметь возможность расположения текста в пределах изменяющейся области, например, при отрисовке собственноручно созданного виджета. Scribe предоставляет возможность для обтекания текстом, подобно тому, как это реализовано в QTextLayout, и расположения текста без потребности создания документа с начала.

Файл:Plaintext-layout.png

Отображение простого текста обычно осуществляется вдоль прямых линий. Пример, приведенный ниже, расположит простой текст вдоль внешней кромки правой части круга, используя обычный шрифт.

     QTextLayout textLayout(text, font);
     qreal margin = 10;
     qreal radius = qMin(width()/2.0, height()/2.0) - margin;
     QFontMetrics fm(font);
 
     qreal lineHeight = fm.height();
     qreal y = 0;
 
     textLayout.beginLayout();
 
     while (1) {
         // создаём новую линию
         QTextLine line = textLayout.createLine();
         if (!line.isValid())
             break;
 
         qreal x1 = qMax(0.0, pow(pow(radius,2)-pow(radius-y,2), 0.5));
         qreal x2 = qMax(0.0, pow(pow(radius,2)-pow(radius-(y+lineHeight),2), 0.5));
         qreal x = qMax(x1, x2) + margin;
         qreal lineWidth = (width() - margin) - x;
 
         line.setLineWidth(lineWidth);
         line.setPosition(QPointF(x, margin+y));
         y += line.height();
     }
 
     textLayout.endLayout();
 
     QPainter painter;
     painter.begin(this);
     painter.setRenderHint(QPainter::Antialiasing);
     painter.fillRect(rect(), Qt::white);
     painter.setBrush(QBrush(Qt::black));
     painter.setPen(QPen(Qt::black));
     textLayout.draw(&amp;painter, QPoint(0,0));
 
     painter.setBrush(QBrush(QColor("#a6ce39")));
     painter.setPen(QPen(Qt::black));
     painter.drawEllipse(QRectF(-radius, margin, 2*radius, 2*radius));
     painter.end();

Мы создаем компоновку текста, определяя строку, которую мы хотим показать, и шрифт. Мы добиваемся правильного расположения текста, получая линии текста от объекта форматирования, и располагаем текст в предоставленном пространстве. Линии позиционируются горизонтально и вертикально, поскольку мы смещаемся вниз по странице.

Форматированный текст может быть отображен на устройстве рисования; в вышеприведенном примере форматированный текст отображет на виджете.

[править] Особенности печати

Система компоновки, предназначенная для работы с форматированным текстом, также поддерживает и компоновку документа с разбиением по страницам, что используется Qt для создания заданий для печати. Процедура печати выполняется QPrinter и управляется пользователем через настройки, отображаемые в QPrintDialog:

     QTextDocument *document = editor->document();
     QPrinter printer;
 
     QPrintDialog *dlg = new QPrintDialog(&amp;printer, this);
     if (dlg->exec() != QDialog::Accepted)
         return;
 
     document->print(&amp;printer);

Форматированные текстовые документы с помощью QPrinter и соответствующего движка печати могут также экспортироваться как файлы PDF:

     QString fileName = QFileDialog::getSaveFileName(this, "Export PDF",
                                                     QString(), "*.pdf");
     if (!fileName.isEmpty()) {
         if (QFileInfo(fileName).suffix().isEmpty())
             fileName.append(".pdf");
         QPrinter printer(QPrinter::HighResolution);
         printer.setOutputFormat(QPrinter::PdfFormat);
         printer.setOutputFileName(fileName);
         textEdit->document()->print(&amp;printer);
     }

[править] Сравнение с Qt 3

Возможности основанного на курсорах редактирования, объединенные со структурной моделью документа, предоставляют мощный набор инструментов для редактирования и отображения форматированного текста. Они обеспечивают возможности, которые были недоступны в открытых API Qt 3. Новый текстовый движок полностью переписан и не использует текстовый движок Qt 3.

Класс QTextEdit в Qt 4 полностью переписан и имеет API, существенно отличный от своего коллеги в Qt 3. Неокоторые методы оставлены для совместимости со стилем программирования виджетов, знакомым пользователям Qt 3. Данный класс является полным примером виджета-редактора с новым API, демонстрируя возможности редактирования основанного на интерфейсе редактирования QTextCursor.

[Предыдущая: Система рисования Arthur ] [ Начало ] [Следующая: Классы главного окна в Qt 4 ]



Copyright © 2007 Trolltech Trademarks
Qt 4.3.2