Краткая история Qt
Средства разработки Qt впервые стали известны общественности в мае 1995 года. Первоначально Qt разрабатывались Хаарвардом Нордом (исполнительным директором компании «Trollteeh») и Лириком Чеймб-Ингом (президентом «Trolltech»). (читать далее...)стр. 0 1 2 3
Первое знакомство
«Здравствуй, Qt»
Давайте
начнем с очень простой Qt-программы. Сначала мы разберем
каждую строку этой программы, а затем покажем способы ее компиляции и
выполнения.
1 #include <QApplication>
2
#include <Q (читать далее...)
стр. 4 5 6
Взаимодействие
с пользователем
Второй
пример показывает возможности взаимодействия пользователя с программой.
Приложение представляет собой кнопку, которую пользователь может нажать и
тогда приложение закончит свою работу. Исходный код этой программы очень
напоминает исходный код программы Hello, но здесь вместо QLabel используется QPushButton в качестве главного виджета
и добавляется код, обеспечивающий реакцию программы на действие пользователя
(нажатие кнопки).
(читать далее...)
стр. 7
Компоновка
виджетов
В
данном разделе мы создадим небольшое приложение, которое демонстрирует
применение менеджеров компоновки для размещения виджетов в окне и использование
сигналов и слотов для синхронизации работы двух виджетов. (читать далее...)
стр. 8 9 10
Использование
справочной документации
Справочная
документации по средствам разработки Qt является важным инструментом
в руках любого разработчика Qt-программ, поскольку в ней
есть все необходимые сведения по любому классу и любой функции Qt.
(читать далее...)
стр. 11 12
Создание диалоговых окон
Введение
В данной
главе вы научитесь создавать диалоговые окна с использование! средств
разработки Qt. Диалоговые окна
предоставляют пользователю возможност задавать необходимые значения параметров
и выбирать определенные режимы рабе ты. (читать далее...)
стр. 13
Подклассы
QDialog
Первое
диалоговое окно мы создадим полностью вручную, чтобы было ясно, ка выглядит
исходный код такой программы. Затем мы покажем способы построени. диалоговых
окон в Qt Designer, который является средством
визуального проектирс вания в Qt. (читать далее...)
стр. 14 15 16 17 18 19 20
Подробное
описание технологии сигналов и слотов
Механизм
сигналов и слотов играет решающую роль в разработке программ Qt.
Он позволяет прикладному программисту связывать различные объекты, которые
ничего не знают друг о друге. Мы уже соединяли некоторые сигналы и слоты, объявляли
наши собственные сигналы и слоты, реализовывали наши собственные слоты и
генерировали наши собственные сигналы. (читать далее...)
стр. 21 22 23
Быстрое
проектирование диалоговых окон
Средства
разработки Qt спроектированы таким
образом, чтобы было приятно программировать «вручную» и чтобы этот процесс был
интуитивно понятен; и нет ничего необычного в разработке всего приложения Qt на «чистом» языке С++. (читать далее...)
стр. 24 25 26 27 28 29
Изменяющиеся диалоговые
окна
Нами
были рассмотрены способы формирования диалоговых окон, которые всегда содержат
одни и те же виджеты. В некоторых случаях требуется иметь диалоговые окна,
форма которых может меняться. Наиболее известны два типа изменяющихся
диалоговых окон: расширяемые диалоговые окна (are extension dialogs) и многостраничные диалоговые окна (multi-page dialogs). (читать далее...)
стр. 30 31 32 33 34
Динамические
диалоговые окна
Динамическими
называются диалоговые окна, которые создаются на основе файлов . ui,
сделанных в Qt Designer, во
время выполнения приложения. Вместо преобразования файла . ui компилятором uic в программу на С++ мы можем
загрузить этот файл на этапе выполнения, используя класс QUiLoader:
QUiLoader uiLoader;
(читать далее...)
стр. 35
Встроенные
классы виджетов и диалоговых окон
Qt содержит большой набор встроенных виджетов и
стандартных диалоговых окон, с помощью которых можно реализовать большинство
возможных ситуаций. В данном разделе мы представим изображения экранов почти со
всеми из них. (читать далее...)
стр. 36 37
Создание главных окон
Создание
подкласса QMainWindow
В
данной главе вы научитесь создавать главные окна при помощи средств разработки Qt.
К концу главы вы будете способны построить законченный графически:
пользовательский интерфейс приложения, который имеет меню, панели инструмен
тов, и строку состояния и все необходимые приложению диалоговые окна.
(читать далее...)
стр. 38 39 40 41
Создание
меню и панелей инструментов
Большинство
современных приложений с графическим пользовательским интерфейсом содержат
меню, контекстное меню и панели инструментов. Меню позволяют пользователям
исследовать возможности приложения и узнать новые способы работы, а контекстные
меню и панели инструментов обеспечивают быстрый доступ к часто используемым
функциям.
(читать далее...)
стр. 42 43 44 45
Создание
и настройка строки состояния
После
создания меню и панелей инструментов мы готовы приступить к созданию строки
состояния приложения Электронная таблица.
Обычно
строка состояния содержит два индикатора: положение текущей ячейки и формулу
текущей ячейки. (читать далее...)
стр. 46 47
Реализация
меню File
В
данном разделе мы определим слоты и закрытые функции, необходимые для
обеспечения работы меню File и для управления списком
недавно используемых файлов.
void MainWindow::newFile() {
if (okToContinue ()) { spreadsheet->c (читать далее...)
стр. 48 49 50 51 52 53
Применение
диалоговых окон
В
данном разделе мы рассмотрим способы применения диалоговых окон в Qt:
как они создаются и инициализируются и как они реагируют на действия пользователя
при работе с ними. Мы будем использовать диалоговые окна Find,
Go-to-Cell и Sort (найти, перейти в ячейку и
сортировать), которые были созданы нами в главе 2. (читать далее...)
стр. 54 55 56 57 58 59
Сохранение
настроек приложения
В
конструкторе MainWindow мы уже вызывали функцию readSettingsO для загрузки сохраненных приложением настроек.
Аналогично в функции closeEvent () мы вызывали writeSettingsO для сохранения настроек. (читать далее...)
стр. 60 61
Работа
со многими документами
Теперь
мы готовы написать функцию main() приложения Электронная
таблица:
#include <QApplication>
ttinclude "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv); (читать далее...)
стр. 62 63 64
Экранные
заставки
Многие
приложения при запуске выводят на экран заставки. Некоторыми разработчиками заставки
используются, чтобы сделать менее заметным медленный запуск приложения, а в
других случаях это делается для удовлетворения требований отделений, отвечающих
за маркетинг. (читать далее...)
стр. 65
Реализация функциональности приложения
Центральный
виджет
Центральную
область QMainWindow может занимать любой виджет.
Ниже даете, краткий обзор возможных вариантов.
1. Стандартный виджет Qt
В
качестве центрального могут использоваться стандартные виджеты, наприме QTableWidget или QTextEdit. (читать далее...)
стр. 66
Создание
подкласса QTableWidget
Класс
Spreadsheet наследует QTableWidget. Виджет QTableWidget фактически является сеткой, представляющей собой
двумерный разряженный массив. На нем отображается часть ячеек всей сетки,
полученная при прокрутке изображения пользователем. (читать далее...)
стр. 67 68 69 70 71
Загрузка
и сохранение
Теперь
мы реализуем загрузку и сохранение файла данных для приложения Электронная
таблица, используя двоичный пользовательский формат. Для этого мы используем
объекты QFile и QDataStream, которые совместно обеспечивают независимый от
платформы ввод-вывод в двоичном формате.
(читать далее...)
стр. 72 73 74
Реализация
меню Edit
Теперь
мы готовы приступить к реализации слотов, относящихся к меню Edit данного приложения,
void Spreadsheet::cut()
{
соруО;
del();
}
Слот cut () соответствует пункту меню Edit|Cut (Правка|Вырезать). (читать далее...)
стр. 75 76 77
Реализация
других меню
Теперь мы реализуем слоты для
пунктов меню Tools и Options.
Рис.
4.7. Меню Tools и Options приложения Электронная таблица
void Spreadsheet::recalculate() {
for (int row = 0; row < (читать далее...)
стр. 78 79 80
Создание
подкласса QTableWidgetltem
Класс
Cell наследует QTableWidgetltem. Этот класс спроектирован
для удобства работы с Spreadsheet, но он не имеет никаких
особых связей с данным классом электронной таблицы и теоретически может
применяться для любого объекта QTableWidget.
(читать далее...)
стр. 81 82 83 84 85 86 87
Создание пользовательских виджетов
Настройка
виджетов Qt
В некоторых случаях мы
обнаруживаем необходимость в более специализирс ванной настройке виджета Qt по сравнению с той, которую можно обеспечить путе!
установки его свойств в Qt Designer или с помощью вызова его функций. (читать далее...)
стр. 88 89 90
Создание подкласса QWidget
Многие
пользовательские виджеты являются простой комбинацией существующих виджетов,
либо встроенных в Qt, либо других
пользовательских виджетов (таких, как HexSpinBox). Если пользовательские
виджеты строятся на основе существующих виджетов, то они, как правило, могут
разрабатываться в Qt Designer.
(читать далее...)
стр. 91 92 93 94 95 96 97 98 99
Интеграция
пользовательских виджетов в Qt Designer
Прежде
чем мы сможем использовать пользовательские виджеты в Qt Designer, мы должны сделать так, что Qt Designer будет знать о них. Для этого
существует два способа: метод «продвижения» («promotion») и метод подключения (plugin).
(читать далее...)
стр. 100 101 102
Двойная буферизация
Двойная
буферизация является методом программирования графического пользовательского
интерфейса, при котором изображение виджета формируется вне экрана в виде
пиксельной карты, и затем эта пиксельная карта выводится на экран. (читать далее...)
стр. 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
Управление компоновкой
Компоновка виджетов на форме
Существует
три основных способа управления компоновкой дочерних виджетов формы: абсолютное
позиционирование, ручная компоновка и применение менеджеров компоновки. Мы
рассмотрим по очереди каждый из этих методов, используя в качестве нашего
примера диалоговое окно Find File (найти файл), показанное на рис. (читать далее...)
стр. 118 119 120 121
Стековая
компоновка
Класс QStackedLayout ^менеджер
стековой компоновки) управляет компоновкой набора дочерних виджетов или
«страниц», показывая в каждый конкретный момент только одну из них и скрывая от
пользователя остальные. (читать далее...)
стр. 122 123
Разделители
Разделитель
QSplitter представляет собой виджет, который содержит другие
виджеты. Виджеты в разделителе отделены друг от друга разделительными линиями.
Пользователи могут изменять размеры дочерних виджетов разделителя посредством
перемещения разделительных линий. (читать далее...)
стр. 124 125
Области
с прокруткой
Класс
QScrollArea содержит область отображения, которую можно прокручивать,
и две полосы прокрутки. Если мы хотим добавить в виджет полосы прокрутки,
значительно проще использовать класс QScrollArea, чём создавать свои
собственные экземпляры QScrollBar и самим реализовывать
функциональность скроллинга. (читать далее...)
стр. 126
Прикрепляемые
виджеты и панели инструментов
Прикрепляемыми
являются виджеты, которые могут крепиться к определенным областям главного окна
приложения QMainWindow или быть независимыми «плавающими»
окнами. QMainWindow имеет четыре области
крепления таких виджетов: одна сверху, одна снизу, одна слева и одна справа от
центрального виджета. (читать далее...)
стр. 127 128
Многодокументный
интерфейс
Приложения,
которые обеспечивают работу со многими документами в центральной области
главного окна, называются приложениями с многодокументным интерфейсом или MDI-приложениями.
В Qt MDI-приложения создаются с
использованием в качестве центрального виджета класса QWorkspace и путем представления каждого документа в виде
дочернего окна QWorkspace.
(читать далее...)
стр. 129 130 131 132 133 134
Обработка событий
Переопределение
обработчиков событий
В Qt событие
(event) - это объект, производный от QEvent. Qt обрабатывает
бс лее сотни типов событий, каждое из которых идентифицируется определенным зна
чением перечисления. Например, QEvent: type0 возвращает QEvent: :MouseButton Press для событий
нажатия кнопки мышки.
(читать далее...)
стр. 135 136 137 138
Установка
фильтров событий
Одним
из действительно эффективных средств в модели событий Qt является возможность с помощью некоторого экземпляра
объекта QObject контролировать события
другого экземпляра объекта QObject еще до того, как они дойдут
до последнего.
(читать далее...)
стр. 139 140 141
Обработка
событий во время продолжительных процессов
Когда мы вызываем QApplication:; ехес(), тем
самым начинаем цикл обработки событий Qt. При запуске приложения Qt генерирует несколько событий для отображения на экране
виджетов. После этого начинает выполняться цикл обработки событий: постоянно
проверяется их возникновение, и эти события отправляются к объектам QObject данного
приложения.
(читать далее...)
стр. 142 143 144
Графика 2D и 3D
Рисование
при помощи QPainter
Чтобы
начать рисовать на устройстве рисования (обычно это виджет), мы прос то создаем
объект QPainter и передаем ему указатель на
устройство. Например:
void MyWidget::paintEvent(QPaintEvent *event) {
QPainter painter(this);
(читать далее...)
стр. 145 146 147 148
Преобразования
рисовальщика
В
используемой по умолчанию координатной системе рисовальщика QPainter точка (0,0) находится в левом верхнем углу устройства
рисования; значение координат х увеличивается при
перемещении вправо, а значение координат у увеличивается при
перемещении вниз. (читать далее...)
стр. 149 150 151 152 153 154 155
Высококачественное
воспроизведение изображения при помощи QImage
При
рисовании мы можем столкнуться с необходимостью принятия компромиссных решений
относительно скорости и точности. Например, в системах XII и Мае OS X рисование по виджету QWidget или по пиксельной карте QPixmap основано на применении родного для платформы графического
процессора (paint engine). (читать далее...)
стр. 156 157 158 159 160 161 162
Графические
средства OpenGL
OpenGL является стандартным программным интерфейсом,
предназначенным для воспроизведения графики 2D и 3D. Приложения Qt могут отображать графику 3D, используя модуль QtOpenGL, который рассчитан на
применение системной библиотеки OpenGL. (читать далее...)
стр. 163 164 165 166
Технология «drag-and-drop»
Обеспечение
поддержки технологии “drag-and-drop”
Технология
«drag-and-drop»
состоит из двух действий: перетаскивание «захваченных» объектов и их
«освобождение». Виджеты в Qt могут использоваться в
качестве переносимых объектов, в качестве места отпускания этих объектов или в
обоих качествах.
(читать далее...)
стр. 167 168 169 170 171
Поддержка
пользовательских типов переносимых объектов
До
сих пор в представленных примерах мы полагались на поддержку QMimeData распространенных типов МШЕ. Так, мы вызывали QMimeData::setText() для создания объекта
переноса текста и использовали QMimeData: иrls()
для получения содержимого объекта переноса типа text/uri-list.
(читать далее...)
стр. 172 173 174 175
Работа
с буфером обмена
помещения
данных в буфер обмена и функции text(), image() или pixmap() для считывания данных из
буфера обмена. Мы уже приводили примеры работы с буфером обмена в приложении
Электронная таблица из главы 4,
Для некоторых
приложений может оказаться не достаточно встроенных функциональных
возможностей. (читать далее...)
стр. 176
Классы отображения элементов
Применение
удобных классов отображения элементов
В
ранних версиях Qt виджеты отображения
элементов заполнялись содержимым всего набора данных; пользователи обычно
выполняли необходимые операции по поиску и редактированию данных, находящихся в
виджете, в какой-то момент сделанные изменения записывались обратно в источник
данных. (читать далее...)
стр. 177 178 179 180 181 182 183
Применение
заранее определенных моделей
В Qt заранее определено несколько моделей, предназначенных
для использования с классами представлений:
QStringListModel
Хранит список строк
QStandardltemModel
Хранит Данные произвольной
иерархической структуры
QDirModel
Формирует структуру локальной файловой системы
QSqlQueryModel
Формирует набор результата
SQL-запроса
QSqlTableModel
Формирует SQL-таблицу
QSqlRelationalTableModel
Формирует SQL-таблицу с
внешними ключами (foreign keys)
QSortFilterProxyModel
.
(читать далее...)
стр. 184 185 186 187
Реализация
пользовательских моделей
Заранее
определенные в Qt модели предлагают удобные средства
обработки и просмотра данных. Однако некоторые источники данных не могут
эффективно использоваться для этих моделей, й в этих случаях необходимо
создавать пользовательские модели, оптимизированные на применение таких
источников данных. (читать далее...)
стр. 188 189 190 191 192 193 194 195 196 197 198
Реализация
пользовательских делегатов
Воспроизведение
и редактирование в представлениях отдельных элементов выполняются с помощью
делегатов. В большинстве случаев возможности делегата, предоставляемого
представлением по умолчанию, оказываются достаточными. (читать далее...)
стр. 199 200 201 202 203
Классы-контейнеры
Последовательные
контейнеры
Главное
преимущество Qt-контейнеров - одинаковое
поведение на всех платформах и неявное совместное использование данных.
Неявное совместное использование или «копирование при записи» - это
оптимизация, позволяющая передавать контейнеры целиком без существенного
ухудшения производительности. (читать далее...)
стр. 204 205 206 207 208 209 210 211 212
Ассоциативные
контейнеры
Ассоциативный
контейнер содержит произвольное количество элементов одинакового типа,
индексируемых некоторым ключом. Qt содержит два основных класса
ассоциативных контейнеров: QMap<K,
T>HQHash<K (читать далее...)
стр. 213 214 215
Обобщенные
алгоритмы
В
заголовочном файле <QtAlgorithms> объявляются глобальные
шаблонные функции, которые реализуют основные алгоритмы для контейнеров.
Большинство этих функций работают с итераторами в стиле STL.
(читать далее...)
стр. 216 217
Строки,
массивы байтов и объекты произвольного типа
QString, QByteAr ray и QVariant - три класса, которые имеют
много общего с контейнерами и могут использоваться в некоторых контекстах как
альтернатива контейнерам. Кроме того, как и контейнеры, эти классы используют
неявное совмещение данных для уменьшения расхода памяти и повышения
быстродействия.
(читать далее...)
стр. 218 219 220 221 222 223 224
Ввод-вывод
Введение
Почти
в каждом приложении приходится читать или записывать файлы или выполнять
другие операции ввода-вывода. Qt обеспечивает великолепную
поддержку ввода-вывода при помощи GTODevice - мощной абстракции
«устройств», способных читать и записывать блоки байтов. (читать далее...)
стр. 225 226
Чтение
и запись двоичных данных
Самый
простой способ загрузки и сохранения двоичных данных в Qt - получить экземпляр класса QFile, открыть
файл и получить к нему доступ через объект QDataStream. QDataStream обеспечивает не зависимый от
платформы формат памяти, который поддерживает такие базовые типы С++, как int и double, и многие типы данных Qt,
включая QByteArray, QFont, Qlmage, QPixmap, QString и QVariant, а
также классы-контейнеры Qt, например QList<T (читать далее...)
стр. 227 228 229 230 231
Чтение
и запись текста
Хотя
двоичные форматы файлов обычно более компактные, чем текстовые форматы, они
плохо воспринимаются человеком и не могут им редактироваться. Там, где
последнее играет важную роль, можно использовать текстовые форматы. (читать далее...)
стр. 232 233 234 235
Работа
с каталогами
Класс
QDir обеспечивает не зависимые от платформы средства работы
с каталогами и получение информации о файлах. Для демонстрации способов
применения класса QDi г мы напишем небольшое
консольное приложение, которое подсчитывает размер дискового пространства,
занимаемого всеми изображениями в указанном каталоге во всех его подкаталогах,
вне зависимости от глубины их расположения.
(читать далее...)
стр. 236 237
Ресурсы,
внедренные в исполняемый модуль
До
сих пор в этой главе мы говорили о доступе к данным, которые находятся на
внешних устройствах, но в Qt можно также внедрять
двоичные данные или текст в исполняемый модуль приложения. Это обеспечивается
ресурсной системой Qt. (читать далее...)
стр. 238
Связь
между процессами
Класс
QP rocess позволяет выполнять внешние
программы и взаимодействовать с ними. Этот класс работает асинхронно и в
фоновом режиме, из-за чего интерфейс пользователя по-прежнему будет реагировать
на действия пользователя. (читать далее...)
стр. 239 240 241 242
Базы данных
Введение
Модуль
QtSql средств разработки Qt обеспечивает не зависимый от платформы и типа базы данных
интерфейс для доступа с помощью языка SQL к базам данных. Этот
интерфейс поддерживается набором классов, использующих архитектуру Qt модель/представление для интеграции средств доступа к
базам данных с интерфейсом пользователя. (читать далее...)
стр. 243
Соединение
с базой данных и выполнение запросов
Для
выполнения запросов SQL мы должны сначала установить
соединение с базой данных. Обычно настройка соединений с базой данных
выполняется отдельной функцией, которую мы вызываем при запуске приложения.
(читать далее...)
стр. 244 245 246 247 248 249
Представление
данных в табличной форме
Во
многих случаях табличное представление является самым простым представлением
набора данных для пользователей. В этом и последующих разделах мы рассмотрим
простое приложение CD Collection (Коллекция компакт-дисков), в котором модель QSqlTableModel и ее подкласс QSqlRelationalTableModel используются для просмотра и
взаимодействия пользователей с данными, хранимыми в базе данных.
(читать далее...)
стр. 250 251 252
Создание
форм по технологии «master-detail»
Теперь
мы рассмотрим главную форму, которая реализует подход «master-de-tail».
Главный вид представляет собой список компакт-дисков. Вид описания деталей
представляет собой список дорожек текущего компакт-диска. (читать далее...)
стр. 253 254 255 256 257 258
Введение
Написание FTP-клиентов
Написание HTTP-клиентов
Написание клиент-серверных приложений на базе TCP
Передача и прием дейтаграмм UDP
Qt обеспечивает классы QFtp и QHttp для работы с протоколами FTP и HTTP. (читать далее...)
стр. 259
Написание
FTP-клиентов
Мы
начнем с примера чтения одного файла с помощью функции get().
В этом примере создается консольное приложение с именем ftpget, которое скачивает удаленный файл, указанный в командной строке.
Давайте начнем с функции main():
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv); (читать далее...)
стр. 260 261 262 263 264 265
Написание
HTTP-клиента
Класс
QHttp реализует клиентскую часть протокола HTTP в Qt. Он содержит различные функции
для выполнения самых распространенных операций протокола HTTP,
включая get() и post(),
и обеспечивает средство выполнения произвольных запросов HTTP.
(читать далее...)
стр. 266 267 268
Написание
клиент-серверных приложений на базе TCP
Классы
QTcpSocket и QTcpServer могут использоваться для
реализации клиентов и серверов TCP. TCP - это транспортный протокол, который составляет основу
большинства прикладных протоколов сети Интернет, включая FTP и HTTP, и который может также
использоваться для создания пользовательских протоколов.
(читать далее...)
стр. 269 270 271 272 273 274 275
Передача
и прием дейтаграмм UDP
Класс
QUdpSocket может использоваться для отправки и приема дейтаграмм UDP.
UDP - это ненадежный, ориентированный на дейтаграммы
протокол. Некоторые приложения применяют протокол UDP,
поскольку с ним легче работать, чем с протоколом TCP.
(читать далее...)
стр. 276 277 278
XML
Введение
Чтение документов XML при помощи
интерфейса
SAX
Чтение документов XML при помощи
интерфейса
DOM
Запись документов XML
XML (Extensible Markup Language - расширяемый язык разметки)
- это универсальный формат текстовых файлов, который получил широкое
распространение при обмене и хранении данных. (читать далее...)
стр. 279
Чтение
документов XML при помощи интерфейса SAX
SAX является фактическим стандартом программного
интерфейса с открытым исходным кодом, который обеспечивает чтение документов XML.
Классы
Qt для интерфейса SAX моделируют реализацию SAX2
Java с некоторыми отличиями в
названиях для обеспечения принятых в Qt правил обозначений названий
классов и их членов. (читать далее...)
стр. 280 281 282 283
Чтение
документов XML при помощи интерфейса DOM
DOM является стандартным программным интерфейсом
синтаксического анализа документов XML, который разработан
Консорциумом всемирной паутины (W3C).
Qt обеспечивает уровень 2 интерфейса DOM для чтения, обработки и записи документов XML без проверки их достоверности.
(читать далее...)
стр. 284 285 286
Запись
документов XML
Существует
два основных подхода к формированию файлов XML в приложениях Qt:
• мы можем построить дерево DOM и вызвать для него функцию save ();
• мы можем сформировать файл XML вручную.
Выбор
между этими подходами часто не зависит от типа используемого нами интерфейса
для чтения документов XML: SAX или DOM.
(читать далее...)
стр. 287 288
Обеспечение интерактивной помощи
Введение
Всплывающие подсказки, комментарии
в строке состояния и справки «что это
такое?»
Использование QTextBrowser в качестве
простого
браузера системы помощи
Использование Qt Assistant для мощной
интерактивной системы помощи
Большинство
приложений предоставляют своим пользователям систему помощи, работающую в
интерактивном режиме. (читать далее...)
стр. 289
Всплывающие
подсказки, комментарии в строке состояния и справки «что это такое?»
Всплывающая
подсказка (tooltip) представляет собой
небольшое текстовое сообщение, которое появляется при нахождении курсора мышки
на виджете в течение определенного времени. Всплывающие подсказки отображаются
на желтом фоне черными буквами. (читать далее...)
стр. 290 291
Использование
QTextBrowser в качестве простого браузера системы помощи
Для
больших приложений может потребоваться более сложная система помощи в отличие
от той, которую обычно обеспечивают всплывающие подсказки, комментарии в
строке состояния и справки «что это такое?» (читать далее...)
стр. 292 293 294
Использование
Qt Assistant для мощной интерактивной
системы помощи
Qt Assistant является свободно распространяемой интерактивной
системой помощи, поддерживаемой фирмой «Trolltech». Основным ее достоинством является поддержка индексации и поиск по
всему тексту, а также возможность ее работы с наборами документации нескольких
приложений.
(читать далее...)
стр. 295 296
Интернационализация
Введение
Кроме
латинского алфавита, используемого для английского и многих европейских
языков, Qt 4 обеспечивает широкую
поддержку остальных мировых систем записи:
• Qt применяет Unicode в программном интерфейсе и
во внутренних операциях. (читать далее...)
стр. 297
Работа
с Unicode
Unicode является стандартной кодировкой, которая поддерживает большинство
мировых систем записи. В основе кодировки Unicode лежит идея использования для хранения символов 16 бит,
а не 8, и поэтому она позволяет закодировать примерно 65 000 символов вместо
только 2561. (читать далее...)
стр. 298 299 300 301 302 303 304 305 306 307 308
Динамическое переключение языков
Рис. 17.1. Динамическое меню Language
Поскольку
мы не знаем, какой язык захочет использовать пользователь после запуска
приложения, мы теперь не будем загружать файлы перевода в функции main().
(читать далее...)
стр. 309 310 311 312
Перевод
приложений
Перевод
приложения Qt, которое содержит вызовы tr(),
состоит из трех этапов:
1. Выполнение утилиты lupdate для извлечения из исходного кода приложения всех
видимых пользователем строк.
2. Перевод приложения при
помощи Qt Linguist.
(читать далее...)
стр. 313 314 315
Многопоточная обработка
Введение
•
Создание потоков
• Синхронизация потоков
•
Взаимодействие с главным потоком
•
Применение классов Qt во вторичных
потоках
Обычные
приложения с графическим интерфейсом имеют один поток (thread) выполнения и производят в каждый момент времени одну операцию. (читать далее...)
стр. 316
Создание
потоков
Обеспечить
многопоточную обработку в приложении Qt достаточно просто: мы только
создаем подкласс QThread и переопределяем его функцию
run(). Чтобы показать, как это работает, мы начнем с
рассмотрения программного кода очень простого подкласса QTh read, который периодически
выводит на консоль заданный текст:
class Thread : public QThread {
Q.O (читать далее...)
стр. 317 318
Синхронизация
потоков
Обычным
требованием для многопоточных приложений является синхронизация работы
нескольких потоков. Для этого в Qt предусмотрены следующие
классы: QMutex, QReadWriteLock, QSemaphore и QWaitCondition.
(читать далее...)
стр. 319 320 321 322 323 324
Взаимодействие
с главным потоком
При
запуске приложения Qt работает только один поток -
главный. Только этот поток может создать объект QApplication или QCoreApplication и вызвать для него функцию
ехес(). После вызова ехес() этот поток либо ожидает возникновения какого-нибудь
события, либо обрабатывает какое-нибудь событие.
(читать далее...)
стр. 325 326 327 328
Применение
классов Qt во вторичных потоках
Функция
называется потокозащищенной (thread-safe), если она может спокойно
вызываться одновременно из нескольких потоков. Если две такие функции вызываются
из различных потоков и совместно используют одинаковые данные, результат всегда
будет вполне определенным. (читать далее...)
стр. 329 330
Создание подключаемых модулей
Введение
Динамические
библиотеки (называемые также совместно используемыми библиотеками или
библиотеками DLL) - это независимые модули,
хранимые в отдельном файле на диске, доступ к которым могут получать несколько
приложений. (читать далее...)
стр. 331 332 333 334 335 336 337
Как
обеспечить в приложении возможность подключения модулей
Подключаемый
к приложению модуль является динамической библиотекой, которая реализует
какой-нибудь один или несколько интерфейсов. Интерфейс - это класс, содержащий
только чисто виртуальные функции. (читать далее...)
стр. 338 339 340
Написание
подключаемых к приложению модулей
Подключаемый
к приложению модуль является подклассом QObject и интерфейсов, которые он собирается обеспечить.
Прилагаемый к этой книге компакт-диск содержит два подключаемых модуля,
предназначенных для приложения Text Art,
представленного в предыдущем разделе, и показывающих, что это приложение правильно
работает с несколькими подключаемыми модулями.
(читать далее...)
стр. 341 342 343
Возможности, зависимые от платформы
Введение
В
данной главе мы рассмотрим некоторые доступные программистам Qt возможности, которые зависят от платформы. Мы начнем
с рассмотрения способов доступа к таким «родным» программным интерфейсам, как
Win32 API в системе Windows, Carbon в системе Mac OS X и Xlib в системе XII. (читать далее...)
стр. 344
Применение
«родных» программных интерфейсов
Всесторонний
программный интерфейс Qt удовлетворяет большинству
требований на всех платформах, но при некоторых обстоятельствах нам может
потребоваться базовый, платформозависимый программный интерфейс. (читать далее...)
стр. 345 346 347 348 349 350 351 352 353 354 355
Управление
сеансами в системе XII
Когда
мы выходим из системы XII, некоторые оконные менеджеры спрашивают нас о
необходимости сохранения сеанса. Если мы отвечаем утвердительно, то при
следующем входе в систему работа приложений будет автоматически возобновлена с
того же экрана и, в идеальном случае, с того же состояния, которое было во
время выхода из системы.
(читать далее...)
стр. 356 357 358 359 360
Программирование встроенных систем
Встроенные
системы
Разработка
программного обеспечения для таких мобильных устройств, как карманные
компьютеры и мобильные телефоны, может представлять собой очень сложную задачу,
поскольку встроенные системы обычно имеют более медленные процессоры, меньший
объем постоянной памяти (на флеш-картах или на жестких дисках), меньший объем
основной памяти и дисплеи меньшего размера, чем настольные компьютеры.
(читать далее...)
стр. 361
Первое
знакомство с Qtopia
Приложения
Qtopia Core могут разрабатываться на
любой платформе, позволяющей запускать цепочки многоплатформенных
инструментальных средств. Наи* более распространено построение кросс-компилятора
GNU С++ в системе Unix. (читать далее...)
стр. 362 363
Настройка
QtopiaCore
При установке
Qtopia Core можно указать функции,
которые мы хотим устранить, чтобы снизить расход памяти. В состав Qtopia Core входит сотня конфигурируемых
функций, каждой из которых соответствует какой-то препроцессорный символ.
(читать далее...)
стр. 364 365
Установка Qt
В данном приложении рассматривается порядок установки Qt в вашу систему с компакт-диска, который прилагается к этой книге. Компакт-диск содержит версию Qt 4.1.1 для Windows, Mac OS X и XI1 (для Linux и большинства версий Unix). (читать далее...)стр. 366 367 368 369
С++ для программистов Java и С#
Введение
вC++
Данное
приложение представляет собой краткое введение в язык С++, предназначенное для
разработчиков, знакомых с Java или С#. Предполагается, что
вы знакомы с такими концепциями объектно-ориентированного программирования,
как наследование и полиморфизм, и хотите обучиться программированию на С++. (читать далее...)
стр. 370 371
Первое
знакомство с С++
Программа
С++ состоит из одной или нескольких единиц компиляции. Каждая единица
компиляции представляет собой отдельный файл исходного кода, обычно имеющий
расширение . срр (другими распространенными расширениями являются . (читать далее...)
стр. 372 373 374 375
Основные
отличия языков
Теперь
мы более внимательно рассмотрим области, в которых С++ отличается от Java и С#. Многие языковые различия объясняются
особенностями скомпилированных модулей С++ и повышенным вниманием к
производительности. (читать далее...)
стр. 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
Стандартная
библиотека С++
В
данном разделе мы кратко рассмотрим стандартную библиотеку С++. На рис. Б.З
приводится список базовых заголовочных файлов С++. Заголовочные файлы <exception>, <limits>, <new>
и ctypeinf о> (читать далее...)
стр. 400 401