Приобрести книгу можно на сайте ozon.ru и в электронном виде на Google Play:
14 thoughts on “Глава 12 – Интервью, или модель-представление”
Здравствуйте, Макс!
Стр. 195, раздел “Делегат”. В начале раздела написано, что “В Qt есть готовый класс делегата QStyledItemDelegate (рис. 12.7)…”, но на рисунке изображен класс QItemDelegate. Как я понял из справки Qt класс QStyledItemDelegate предпочтительнее, т.к. выполняет задачу “отрисовывания элементов представления”.
Макс, на страницах 203 – 209 Вы создаете собственную модель данных IntListModel унаследованную от QAbstractListModel. Изменения значений в представлениях QListView и QTableView, которые отображают данные представляемые этой моделью, можно делать с помощью ввода с клавиатуры или увеличивая/уменьшая стрелками (вверх и вниз). Это встроенный элемент счетчика? Он по умолчанию включен в эту модель (QAbstractListModel)?
И еще один вопрос, как реализовать закрытие обоих окон при закрытии только одного? В классах QListView и QTableView нет сигнала closeЧто_То_Там(), это можно сделать только при использовании родительских виджетов для этих классов (чтобы действовать через них)?
Здравствуйте, Вячеслав! В модель никакие элементы не включаются, за механизм редактирования отвечает делегат. Вы можете перезаписать в собственном делегате метод editorEvent() для того, чтобы внести в этот процесс какие либо изменения. На рисунке 12.1 показано как компоненты “интервью” взаимодействуют друг с другом.
По поводу закрытия окон. QTabelView и QListView являются виджетами, а следовательно имеют метод события закрытия closeEvent(). Вы можете унаследовать эти классы и выслать из их объектов сигнал, который будет уведомлять о закрытии окна. Если вы не хотите наследовать эти классы, то можете просто реализовать класс фильтра (см.гл.15) для события QCloseEvent и установить его в виджетах QTabelView и QListView.
Спасибо за разъяснения, Макс! С делегатом как-то сложновато, не до конца понял этот механизм, ну, думаю, в будущем еще вернусь к этому вопросу… А в понятиях модели и представления, вроде, разобрался, очень понравился такой подход, особенно понравился механизм промежуточной модели данных (Proxy model), думаю, на практике может очень пригодиться.
Здравствуйте , у меня возникают проблемы с компиляцией “Табличной модели” представленной в листинге 12.17 , TableModel принимается за абстрактный класс , не было ли у кого-нибудь схожих проблем ?
Здравствуйте, Макс!
Стр. 195, раздел “Делегат”. В начале раздела написано, что “В Qt есть готовый класс делегата QStyledItemDelegate (рис. 12.7)…”, но на рисунке изображен класс QItemDelegate. Как я понял из справки Qt класс QStyledItemDelegate предпочтительнее, т.к. выполняет задачу “отрисовывания элементов представления”.
Да, на рисунке 12.7 действительно отсутствует класс QStyledItemDelegate. Согласен с Вами, что он тоже должен там быть! Спасибо!
Стр. 203 Листинг 12.6:
lst << "Linux" << "Windows" << "MacOS" << "OS2";
Небольшая опечатка, вместо "OS2" должно быть "Android".
Да, должно быть “Android” вместо “OS2”. Спасибо, Вячеслав!
Пожалуйста, Макс! Стр. 215 та же опечатка в Листинге 12.19.
Да, там тоже должно быть “Android” вместо “OS2”
Макс, на страницах 203 – 209 Вы создаете собственную модель данных IntListModel унаследованную от QAbstractListModel. Изменения значений в представлениях QListView и QTableView, которые отображают данные представляемые этой моделью, можно делать с помощью ввода с клавиатуры или увеличивая/уменьшая стрелками (вверх и вниз). Это встроенный элемент счетчика? Он по умолчанию включен в эту модель (QAbstractListModel)?
И еще один вопрос, как реализовать закрытие обоих окон при закрытии только одного? В классах QListView и QTableView нет сигнала closeЧто_То_Там(), это можно сделать только при использовании родительских виджетов для этих классов (чтобы действовать через них)?
Здравствуйте, Вячеслав! В модель никакие элементы не включаются, за механизм редактирования отвечает делегат. Вы можете перезаписать в собственном делегате метод editorEvent() для того, чтобы внести в этот процесс какие либо изменения. На рисунке 12.1 показано как компоненты “интервью” взаимодействуют друг с другом.
По поводу закрытия окон. QTabelView и QListView являются виджетами, а следовательно имеют метод события закрытия closeEvent(). Вы можете унаследовать эти классы и выслать из их объектов сигнал, который будет уведомлять о закрытии окна. Если вы не хотите наследовать эти классы, то можете просто реализовать класс фильтра (см.гл.15) для события QCloseEvent и установить его в виджетах QTabelView и QListView.
Спасибо за разъяснения, Макс! С делегатом как-то сложновато, не до конца понял этот механизм, ну, думаю, в будущем еще вернусь к этому вопросу… А в понятиях модели и представления, вроде, разобрался, очень понравился такой подход, особенно понравился механизм промежуточной модели данных (Proxy model), думаю, на практике может очень пригодиться.
Да, Модель/Представление это одна из самых сложных тем в Qt. Но овладение этой темой крайне желательно!
Здравствуйте , у меня возникают проблемы с компиляцией “Табличной модели” представленной в листинге 12.17 , TableModel принимается за абстрактный класс , не было ли у кого-нибудь схожих проблем ?
На стр. 192 опечатка в QAbstractItemView в абзаце перед рисунком.
На стр. 199 после таблицы опечатка в QFileSystemModel.
Ольга, спасибо исправлю.