Жасмин Бланшет - QT 4: программирование GUI на С++
- Название:QT 4: программирование GUI на С++
- Автор:
- Жанр:
- Издательство:КУДИЦ-ПРЕСС
- Год:2007
- Город:Москва
- ISBN:978-5-91136-038-2
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Жасмин Бланшет - QT 4: программирование GUI на С++ краткое содержание
Единственное официальное руководстро по практическому программированию в среде Qt 4.1.
Применяя средства разработки Qt компании «Trolltech», вы сможете создавать на С++ промышленные приложения, которые естественно работают в средах Windows, Linux/UNIX, Linux для встроенных систем без изменения программного кода и Mac Os X. Книга написана сотрудниками компании «Trolltech». Она представляет собой практическое руководство по успешному применению самой мощной из всех созданных до сих пор версий Qt — Qt 4.1.
Из книги «Qt 4: программирование GUI на С++» вы узнаете о наиболее эффективных приемах и методах программирования с применением Qt 4 и овладеете ключевыми технологиями в самых различных областях — от архитектуры Qt модель/представление до мощного графического процессора 2D. Авторы вооружают читателей беспрецедентно глубокими знаниями модели событий и системы компоновки Qt.
На реалистических примерах они описывают высокоэффективные методы во всех областях — от разработки основных элементов графического пользовательского интерфейса до передовых методов интеграции с базой данных и XML. Каждая глава содержит полностью обновленный материал.
Данное издание:
• Включает новые главы по архитектуре Qt 4 модель/представление и поддержке подключаемых модулей Qt, а также краткое введение в программирование встроенных систем на платформе Qtopia.
• Раскрывает все основные принципы программирования в среде Qt — от создания диалоговых и других окон до реализации функциональности приложений.
• Знакомит с передовыми методами управления компоновкой виджетов и обработкой событий.
• Показывает, как можно с наибольшей эффективностью использовать новые программные интерфейсы Qt 4, в частности мощный графический процессор 2D и новые простые в применении классы—контейнеры.
• Представляет передовые методы Qt 4, которых нет ни в одной книге: от создания подключаемых модулей, расширяющих возможности Qt, и приложений, до применения «родных» для конкретной платформы программных интерфейсов.
• Содержит приложение с подробным введением в программирование на С++ в среде Qt для опытных Java—разработчиков.
Жасмин Бланшет (Jasmine Blanchette) — менеджер по документированию и старший разработчик компании «Trolltech» с 2001 года. Он является редактором «Qt Quarterly», информационного бюллетеня компании «Trolltech», и соавтором книги «Qt 3: программирование GUI на С++».
Марк Саммерфилд (Mark Summerfield) — независимый преподаватель и консультант по С++, Qt и Python. Он работал менеджером по документированию в компании «Trolltech» на протяжении трех лет. Марк является соавтором книги «Qt 3: программирование GUI на С++».
QT 4: программирование GUI на С++ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
16 connect(&tcpSocket, SIGNAL(connected()),
17 this, SLOT(sendRequest()));
18 connect(&tcpSocket, SIGNAL(disconnected()),
19 this, SLOT(connectionClosedByServer()));
20 connect(&tcpSocket, SIGNAL(readyRead()),
21 this, SLOT(updateTableWidget()));
22 connect(&tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
23 this, SLOT(error()));
24 }
В конструкторе мы инициализируем поля редактирования даты и времени текущей датой и временем. Мы также не показываем индикатор состояния программы, потому что он необходим только при активном соединении. В Qt Designer свойства minimum и maximum индикатора состояния устанавливались в 0. Это определяет поведение QProgressBar как индикатора занятости вместо стандартного индикатора, показывающего процент выполнения работы.
В конструкторе мы также связываем сигналы connected(), disconnected(), readyRead() и error(QAbstractSocket::SocketError) класса QTcpSocket с закрытыми слотами.
01 void TripPlanner::connectToServer()
02 {
03 tcpSocket.connectToHost("tripserver.zugbahn.de", 6178);
04 tableWidget->setRowCount(0);
05 searchButton->setEnabled(false);
06 stopButton->setEnabled(true);
07 statusLabel->setText(tr("Connecting to server..."));
08 progressBar->show();
09 nextBlockSize = 0;
10 }
Слот connectToServer() выполняется, когда пользователь нажимает клавишу Search для запуска процедуры поиска. Мы вызываем функцию connectToHost() объекта типа QTcpSocket для подсоединения к серверу, который, как мы предполагаем, доступен через порт 6178 по вымышленному адресу хоста tripserver.zugbahn.de. (Если вы собираетесь проверить работу этого примера на вашей машине, замените имя хоста на QHostAddress::LocalHost.) Вызов connectToHost() выполняется асинхронно; эта функция всегда немедленно возвращает управление. Соединение обычно устанавливается позже. Объект QTcpSocket генерирует сигнал connected(), если соединение успешно осуществлено и действует, или error(QAbstractSocket::SocketError), если соединение завершилось неудачей.
Затем мы обновляем интерфейс пользователя, в частности делаем видимым индикатор состояния приложения.
Наконец, мы устанавливаем переменную nextBlockSize на 0. Эта переменная содержит длину следующего блока, полученного от сервера. Мы задали значение 0, поскольку еще не знаем размер следующего блока.
01 void TripPlanner::sendRequest()
02 {
03 QByteArray block;
04 QDataStream out(&block, QIODevice::WriteOnly);
05 out.setVersion(QDataStream::Qt_4_1);
06 out << quint16(0) << quint8('S') << fromComboBox->currentText()
07 << toComboBox->currentText() << dateEdit->date()
08 << timeEdit->time();
09 if (departureRadioButton->isChecked()) {
10 out << quint8('D');
11 } else {
12 out << quint8('A');
13 }
14 out.device()->seek(0);
15 out << quint16(block.size() - sizeof(quint16));
16 tcpSocket.write(block);
17 statusLabel->setText(tr("Sending request..."));
18 }
Слот sendRequest() выполняется, когда объект QTcpSocket генерирует сигнал connected(), уведомляя об установке соединения. Задача этого слота — сгенерировать запрос к серверу с передачей всей введенной пользователем информации.
Запрос является двоичным блоком следующего формата:
• quint16 — размер блока в байтах (не учитывая данное поле),
• quint8 — тип запроса (всегда «S»),
• QString — пункт отправления,
• QString — пункт прибытия,
• QDate — дата поездки,
• QTime — примерное время отправления или прибытия,
• quint8 — признак времени отправления («D») или прибытия («А»).
Сначала мы записываем данные в массив типа QByteArray с именем block. Мы не можем писать данные непосредственно в QTcpSocket, поскольку мы не знаем размер блока, который будет отсылаться первым, пока не разместим все данные в блоке.
Сначала мы записываем 0 в поле размера блока и затем размещаем остальные данные. Затем мы делаем вызов seek(0) для устройства ввода—вывода (для установки на начало буфера QBuffer, создаваемого автоматически классом QDataStream), чтобы встать на начало массива байтов и переписать первоначальный 0 фактическим размером блока данных. Эта величина рассчитывается как размер блока за вычетом sizeof(quint16) (то есть 2), чтобы исключить поле с размером блока из общей суммы байтов. После этого мы вызываем функцию write() для объекта QTcpSocket, чтобы отослать этот блок на сервер.
01 void TripPlanner::updateTableWidget()
02 {
03 QDataStream in(&tcpSocket);
04 in.setVersion(QDataStream::Qt_4_1);
05 forever {
06 int row = tableWidget->rowCount();
07 if (nextBlockSize == 0) {
08 if (tcpSocket.bytesAvailable() < sizeof(quint16))
09 break;
10 in >> nextBlockSize;
11 }
12 if (nextBlockSize == 0xFFFF) {
13 closeConnection();
14 statusLabel->setText(tr("Found %1 trip(s)").arg(row));
15 break;
16 }
17 if (tcpSocket.bytesAvailable() < nextBlockSize)
18 break;
19 QDate date;
20 QTime departureTime;
21 QTime arrivalTime;
22 quint16 duration;
23 quint8 changes;
24 QString trainType;
25 in >> date >> departureTime >> duration >> changes >> trainType;
26 arrivalTime = departureTime.addSecs(duration * 60);
27 tableWidget->setRowCount(row + 1);
28 QStringList fields;
29 fields << date.toString(Qt::LocalDate)
30 << departureTime.toString(tr("hh:mm"))
31 << arrivalTime.toString(tr("hh:mm"))
32 << tr("%1 hr %2 min").arg(duration / 60).arg(duration % 60)
33 << QString::number(changes) << trainType;
34 for (int i = 0; i < fields.count(); ++i)
35 tableWidget->setItem(row, i, new QTableWidgetItem(fields[i]));
36 nextBlockSize = 0;
37 }
38 }
Слот updateTableWidget() подсоединяется к сигналу readyRead() класса QTcpSocket, который генерируется всякий раз при получении QTcpSocket новых данных от сервера.
Сервер пересылает нам список возможных железнодорожных рейсов, которые удовлетворяют критерию пользователя. Каждый рейс передается в виде одного блока, и каждый блок начинается с поля размера блока. Цикл forever необходим, потому что мы не обязательно получаем от сервера блоки по одному [7]. Мы можем получить целый блок или только его часть или полтора блока либо даже все блоки сразу.

Рис. 14.2. Блоки приложения Trip Server.
Итак, как действует цикл forever? Если переменная nextBlockSize равна 0, это означает, что мы не прочитали размер следующего блока. Мы пытаемся прочитать его (предполагается, что имеется по крайней мере 2 байта). Сервер использует значение 0xFFFF в поле размера блока для указания на то, что все данные переданы, и поэтому, если мы обнаруживаем это значение, мы знаем, что достигнут конец.
Если размер блока не равен 0xFFFF, мы пытаемся считать следующий блок. Во-первых, мы проверяем наличие блока байтов необходимого размера. Если его нет, мы прерываем цикл. Сигнал readyRead() будет вновь сгенерирован, когда станет доступно больше данных, и мы попытаемся повторить процедуру.
Читать дальшеИнтервал:
Закладка: