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

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

Жанры

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

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

Шрифт:

Удаление — это последняя операция, которую позволяет сделать диалоговое окно ArtistForm. Вместо каскадного удаления (вскоре будет рассмотрено) мы разрешаем удалять артистов только в том случае, если в коллекции нет их компакт-дисков.

01 void ArtistForm::deleteArtist

02 {

03 tableView->setFocus;

04 QModelIndex index = tableView->currentIndex;

05 if (!index.isValid)

06 return;

07 QSqlRecord record = model->record(index.row);

08 QSqlTableModel cdModel;

09 cdModel.setTable("cd");

10 cdModel.setFilter("artistid = " + record.value("id").toString);

11 cdModel.select;

12 if (cdModel.rowCount == 0) {

13 model->removeRow(tableView->currentIndex.row);

14 } else {

15 QMessageBox::information(this, tr("Delete Artist"),

16 tr("Cannot delete %1 because there are CDs associated "

17 "with this artist in the collection.")

18 .arg(record.value("name").toString));

19 }

20 }

Если

выделена какая-то запись, мы проверяем наличие компакт-дисков у данного артиста, и если они отсутствуют, мы сразу же удаляем эту запись артиста. В противном случае мы выводим на экран окно с сообщением о причине невыполнения удаления. Строго говоря, здесь следовало бы использовать транзакцию, потому что из программного кода видно, что между вызовами функций cdModel.select и model->removeRow у артиста может появиться свой компакт-диск. Транзакция будет рассмотрена в следующем разделе.

Создание форм по технологии «master—detail»

Теперь мы рассмотрим главную форму, которая реализует подход «master—detail». Главный вид представляет собой список компакт-дисков. Вид описания деталей представляет собой список дорожек текущего компакт-диска. Это диалоговое окно является главным окном приложения CD Collection (Коллекция компакт-дисков); оно показано на рис. 13.1.

01 class MainForm : public QWidget

02 {

03 Q_OBJECT

04 public:

05 MainForm;

06 private slots:

07 void addCd;

08 void deleteCd;

09 void addTrack;

10 void deleteTrack;

11 void editArtists;

12 void currentCdChanged(const QModelIndex &index);

13 void beforeInsertCd(QSqlRecord &record);

14 void beforeInsertTrack(QSqlRecord &record);

15 void refreshTrackViewHeader;

16 private:

17 enum {

18 Cd_Id = 0,

19 Cd_Title = 1,

20 Cd_ArtistId = 2,

21 Cd_Year = 3

22 };

23 enum {

24 Track_Id = 0,

25 Track_Title = 1,

26 Track_Duration = 2,

27 Track_CdId = 3

28 };

29 QSqlRelationalTableModel *cdModel;

30 QSqlTableModel *trackModel;

31 QTableView *cdTableView;

32 QTableView *trackTableView;

33 QPushButton *addCdButton;

34 QPushButton *deleteCdButton;

35 QPushButton *addTrackButton;

36 QPushButton *deleteTrackButton;

37 QPushButton *editArtistsButton;

38 QPushButton *quitButton;

39 };

Мы

используем для таблицы компакт-дисков cd модель QSqlRelationalTableModel, а не простую модель QSqlTableModel, потому что нам придется работать с внешними ключами. Мы рассмотрим по очереди все функции, начиная с конструктора, который мы разобьем на несколько секций из-за его большого размера.

01 MainForm::MainForm

02 {

03 cdModel = new QSqlRelationalTableModel(this);

04 cdModel->setTable("cd");

05 cdModel->setRelation(Cd_ArtistId,

06 QSqlRelation("artist", "id", "name"));

07 cdModel->setSort(Cd_Title, Qt::AscendingOrder);

08 cdModel->setHeaderData(Cd_Title, Qt::Horizontal, tr("Title"));

09 cdModel->setHeaderData(Cd_ArtistId, Qt::Horizontal, tr("Artist"));

10 cdModel->setHeaderData(Cd_Year, Qt::Horizontal, tr("Year"));

11 cdModel->select;

Конструктор начинается с настройки модели QSqlRelationalTableModel, которая управляет таблицей cd. Вызов setRelation указывает модели на то, что ее поле artistid (индекс которого находится в переменной Cd_ArtistId) содержит идентификатор id внешнего ключа из таблицы артистов artist и что вместо идентификаторов необходимо выводить на экран содержимое соответствующего поля name. Если пользователь переходит в режим редактирования этого поля (например, нажимая клавишу F2), модель автоматически выведет на экран поле с выпадающим списком имен всех артистов, и если пользователь выбирает другого артиста, таблица cd будет обновлена.

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

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Пышка и Герцог

Ордина Ирина
Фантастика:
юмористическое фэнтези
историческое фэнтези
фэнтези
5.00
рейтинг книги
Пышка и Герцог

Имперский Курьер. Том 5

Бо Вова
5. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 5

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Законы Рода. Том 11

Андрей Мельник
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Вираж бытия

Ланцов Михаил Алексеевич
1. Фрунзе
Фантастика:
героическая фантастика
попаданцы
альтернативная история
6.86
рейтинг книги
Вираж бытия

Отмороженный 11.0

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

История "не"мощной графини

Зимина Юлия
1. Истории неунывающих попаданок
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
История немощной графини

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Призыватель нулевого ранга

Дубов Дмитрий
1. Эпоха Гардара
Фантастика:
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга