QT 4: программирование GUI на С++
Шрифт:
Когда
Обработка данных дорожки очень похожа на обработку данных компакт-диска. Для обновления данных пользователь может просто редактировать ячейки. Что касается длительностей дорожек, то класс TrackDelegate гарантирует удобный формат отображения времен и они легко могут редактироваться с использованием QTimeEdit.
Эта функция работает так же, как addCd, со вставкой в представление новой пустой строки.
Если пользователь подтверждает вставку, инициированную функцией addTrack, указанная выше функция вызывается для заполнения полей id и cdid. Упомянутые ранее предостережения применимы, конечно, и в этом случае.
Если пользователь нажимает кнопку Delete Track (удалить дорожку), мы сразу же удаляем дорожку. Если предпочтительнее подтверждать удаление, мы могли бы легко выдать окно с сообщением и кнопками Yes и No.
Слот refreshTrackViewHeader
вызывается из различных мест; он гарантирует вывод на экран горизонтального заголовка в представлении дорожек только в случае наличия дорожек. Он не показывает поля идентификаторов id и cdid и изменяет видимые размеры столбцов таблицы в зависимости от текущего содержимого таблицы.Этот слот, вызывается при нажатии пользователем кнопки Edit Artists (правка артистов). Он обеспечивает вывод на экран данных о компакт-дисках текущего артиста, вызывая форму ArtistForm, рассмотренную в предыдущем разделе, и делая выборку по соответствующему артисту. Если нет текущей записи, функция record возвратит безвредную пустую запись, которая не будет соответствовать (и поэтому не будет выбрана) никакому артисту в форме артистов. В действительности при вызове record.value(Cd_ArtistId), используемого из-за применения модели QSqlRelationalTableModel, которая идентификаторам артистов ставит в соответствие их имена, возвращается имя артиста (а оно будет пустой строкой, если запись пустая). В конце мы снова выбираем данные модели cdModel, что заставляет cdTableView обновить свои видимые ячейки. Это делается для того, чтобы гарантировать правильный вывод на экран имен артистов, поскольку некоторые из них пользователь мог изменить в диалоговом окне ArtistForm.
Для проектов, использующих SQL—классы, необходимо добавить строку
в файлы .pro; это обеспечит сборку приложения с библиотекой QtSql.
Данная глава показывает, что Qt—классы архитектуры модель/представление позволяют достаточно просто просматривать и редактировать данные, размещенные в базах данных SQL. В тех случаях, когда внешние ключи ссылаются на таблицы с большим количеством записей (например, тысячи записей и больше), по-видимому, лучше всего создать свой собственный делегат и использовать его для представления формы со «списком значений» и с возможностями поиска, а не полагаться на выпадающие списки модели QSqlRelationalTableModel. Кроме того, в ситуациях, когда требуется отображать записи в виджете формы, мы должны обеспечить это сами в своем программном коде — использовать QSqlQuery или QSqlTableModel для взаимодействия с базой данных и связать содержимое виджетов пользовательского интерфейса (который мы хотим использовать для представления и редактирования данных) с соответствующей базой данных.
Глава 14. Работа с сетью
Qt обеспечивает классы QFtp и QHttp для работы с протоколами FTP и HTTP. Эти протоколы удобно применять для скачивания файлов из сети и их загрузки на удаленный компьютер, а также в случае применения протокола HTTP для передачи запросов на веб—серверы и получения результатов.
Qt также предоставляет низкоуровневые классы QTCPSocket и QUdpSocket, которые реализуют транспортные протоколы TCP и UDP. TCP — это надежный, ориентированный на соединение протокол, который оперирует потоками данных, циркулирующими между узлами сети, в то время как UDP — ненадежный, не ориентированный на соединения протокол, основанный на передаче дискретных пакетов от одних сетевых узлов к другим. Оба протокола могут использоваться для создания клиентских и серверных сетевых приложений. В серверных приложениях необходимо также использовать класс QTcpServer для обработки входящих ТСР—соединений.