Выбрать главу

Для проектов, использующих SQL—классы, необходимо добавить строку

QT += sql

в файлы .pro; это обеспечит сборку приложения с библиотекой QtSql.

Данная глава показывает, что Qt—классы архитектуры модель/представление позволяют достаточно просто просматривать и редактировать данные, размещенные в базах данных SQL. В тех случаях, когда внешние ключи ссылаются на таблицы с большим количеством записей (например, тысячи записей и больше), по-видимому, лучше всего создать свой собственный делегат и использовать его для представления формы со «списком значений» и с возможностями поиска, а не полагаться на выпадающие списки модели QSqlRelationalTableModel. Кроме того, в ситуациях, когда требуется отображать записи в виджете формы, мы должны обеспечить это сами в своем программном коде — использовать QSqlQuery или QSqlTableModel для взаимодействия с базой данных и связать содержимое виджетов пользовательского интерфейса (который мы хотим использовать для представления и редактирования данных) с соответствующей базой данных.

Глава 14. Работа с сетью

Qt обеспечивает классы QFtp и QHttp для работы с протоколами FTP и HTTP. Эти протоколы удобно применять для скачивания файлов из сети и их загрузки на удаленный компьютер, а также в случае применения протокола HTTP для передачи запросов на веб—серверы и получения результатов.

Qt также предоставляет низкоуровневые классы QTCPSocket и QUdpSocket, которые реализуют транспортные протоколы TCP и UDP. TCP — это надежный, ориентированный на соединение протокол, который оперирует потоками данных, циркулирующими между узлами сети, в то время как UDP — ненадежный, не ориентированный на соединения протокол, основанный на передаче дискретных пакетов от одних сетевых узлов к другим. Оба протокола могут использоваться для создания клиентских и серверных сетевых приложений. В серверных приложениях необходимо также использовать класс QTcpServer для обработки входящих ТСР—соединений.

Написание FTP—клиентов

Класс QFtp реализует клиентскую часть протокола FTP в Qt. Он предлагает различные функции для выполнения самых распространенных операций протокола FTP и позволяет выполнять произвольные команды FTP.

Класс QFtp работает асинхронно. Когда мы вызываем такие функции, как get() или put(), управление сразу же возвращается к нам, а пересылка данных осуществляется после передачи управления обратно в цикл обработки событий Qt. Это обеспечивает работоспособность интерфейса пользователя во время выполнения команд FTP.

Мы начнем с примера чтения одного файла с помощью функции get(). В этом примере создается консольное приложение с именем ftpget, которое скачивает удаленный файл, указанный в командной строке. Давайте начнем с функции main():

01 int main(int argc, char *argv[])

02 {

03 QCoreApplication app(argc, argv);

04 QStringList args = app.arguments();

05 if (args.count() != 2) {

06 cerr << "Usage: ftpget url" << endl << "Example:" << endl

07 << " ftpget ftp://ftp.trolltech.com/mirrors" << endl;

08 return 1;

09 }

10 FtpGet getter;

11 if (!getter.getFile(QUrl(args[1])))

12 return 1;

13 QObject::connect(&getter, SIGNAL(done()), &app, SLOT(quit()));

14 return app.exec();

15 }

Мы создаем объект класса QCoreApplication, а не его подкласса QApplication, чтобы избежать сборки с библиотекой QtGui. Функция QCoreApplication::arguments() возвращает аргументы командной строки в виде списка QStringList, первым элементом которого является имя вызванной программы, а все специфичные для Qt аргументы, такие как —style, удаляются. Центральными моментами в функции main() являются конструирование объекта FtpGet и вызов функции getFile(). Если этот вызов оказывается успешным, мы позволяем циклу событий выполняться до тех пор, пока файл не будет полностью скачан.