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

на главную - закладки

Жанры

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

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

Шрифт:

02 {

03 Q_OBJECT

04 public:

05 TripPlanner(QWidget *parent = 0);

06 private slots:

07 void connectToServer;

08 void sendRequest;

09 void updateTableWidget;

10 void stopSearch;

11 void connectionClosedByServer;

12 void error;

13 private:

14 void closeConnection;

15 QTcpSocket tcpSocket;

16 quint16 nextBlockSize;

17 };

Класс TripPlanner

наследует не только QDialog, но и Ui::TripPlanner (который генерируется компилятором uic, используя файл tripplanner.ui). Переменная—член tcpSocket инкапсулирует соединение TCP. Переменная nextBlockSize используется при синтаксическом анализе блоков, поступивших с сервера.

01 TripPlanner::TripPlanner(QWidget *parent)

02 : QDialog(parent)

03 {

04 setupUi(this);

05 QDateTime dateTime = QDateTime::currentDateTime;

06 dateEdit->setDate(dateTime.date);

07 timeEdit->setTime(QTime(dateTime.time.hour, 0));

08 progressBar->hide;

09 progressBar->setSizePolicy(QSizePolicy::Preferred,

10 QSizePolicy::Ignored);

11 tableWidget->verticalHeader->hide;

12 tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

13 connect(searchButton, SIGNAL(clicked),

14 this, SLOT(connectToServer));

15 connect(stopButton, SIGNAL(clicked), this, SLOT(stopSearch));

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

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

Моров. Том 4

Кощеев Владимир
3. Моров
Фантастика:
фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 4

Снега

Чепурин Юлий Петрович
Поэзия:
драматургия
5.00
рейтинг книги
Снега

Туполев

Бодрихин Николай Георгиевич
1327. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Туполев

Русская драматургия XVIII – XIX вв. (Сборник)

Пушкин Александр Сергеевич
Поэзия:
драматургия
6.25
рейтинг книги
Русская драматургия XVIII – XIX вв. (Сборник)

Неверный

Тоцка Тала
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Неверный

Геном хищника. Книга пятая

Гарцевич Евгений Александрович
5. Я - Легенда!
Фантастика:
рпг
фэнтези
попаданцы
6.00
рейтинг книги
Геном хищника. Книга пятая

Ученик

Листратов Валерий
2. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Ученик

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Чевенгур

Платонов Андрей Платонович
Проза:
советская классическая проза
6.75
рейтинг книги
Чевенгур

Адепт. Том второй. Каникулы

Бубела Олег Николаевич
7. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.05
рейтинг книги
Адепт. Том второй. Каникулы

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.00
рейтинг книги
Шайтан Иван 6

Гамбургский счет: Статьи – воспоминания – эссе (1914–1933)

Шкловский Виктор Борисович
Научно-образовательная:
история
5.00
рейтинг книги
Гамбургский счет: Статьи – воспоминания – эссе (1914–1933)

Лед тронулся, тренер! Но что делать со стояком? Том 2

Некрасов Игорь
2. Ледовая Корона
Любовные романы:
эро литература
5.00
рейтинг книги
Лед тронулся, тренер! Но что делать со стояком? Том 2