Название: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: spectre71 от Июнь 23, 2009, 19:50 До 1-го вызова QTableView::setMode, QTableView::selectionModel() == NULL
Явно баг. Код
Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: Rcus от Июнь 23, 2009, 20:00 Я хочу сказать это прелестно :) Еще бы знать зачем обращаться к модели выделения до установки модели данных (баг то понятен, небольшой поиск по исходникам все проясняет). Я например представление создаю через строитель, которому передается модель, а он создает представление, настраивает его, привязывает модель, формирует делегаты, навешивает на него дополнительных обработчиков, а потом отдает вызывающей стороне.
Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: spectre71 от Июнь 23, 2009, 20:11 Я хочу сказать это прелестно :) Еще бы знать зачем обращаться к модели выделения до установки модели данных (баг то понятен, небольшой поиск по исходникам все проясняет). Я например представление создаю через строитель, которому передается модель, а он создает представление, настраивает его, привязывает модель, формирует делегаты, навешивает на него дополнительных обработчиков, а потом отдает вызывающей стороне. Зачем обращаться, это уже другой вопрос. Мне вот понадобилось передать SelectionModel в коструктор модели(QAbstractItemModel), для упрощения реализации. Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: spectre71 от Июнь 23, 2009, 20:15 Хотя баг несущественен, скорее фича, поскольку при смене QAbstractItemModel - QItemSelectionModel тоже должна смениться.
Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: Rcus от Июнь 23, 2009, 20:19 Ага, вот прочитал предыдущее сообщение и удивился как это, в QAbstractItemView::setModel есть строка setSelectionModel(new QItemSelectionModel(d->model, this));
Поэтому предыдущий указатель будет невалидным. Интересно кстати знать зачем модели информация о выделении. Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: spectre71 от Июнь 24, 2009, 07:34 Интересно кстати знать зачем модели информация о выделении. Например, у меня.Модель - список. На View селекция строками целиком, любых и в любом кол-ве. View может быть только одно! Есть команды(на уровне модели) переместить выделенное на строку вверх, вниз и удалить, есть проверки, какие команды возможны в данный момент. В данной схеме проще для модели знать SelectionModel. А вообще, данная QT концепция с SelectionModel представляется мне весьма сомнительной. На мой взгляд QItemSelectionModel и QAbstractItemModel должны быть объеденены. Мало того что редко требуется установка одной модели в разные view одновременно, еще реже эти view должны иметь разную селекцию. Для таких случаев достаточно что-то типа Proxy. Гораздо чаще базовые данные модели уже изначально имеют свою селекцию(как правило что-то типа Item Index или Indexes), а модель ничего не может об этом сообщить, поскольку она ни о View ни о SelectionModel ничего не знает. Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: Rcus от Июнь 24, 2009, 07:46 Ну и что мешает задействовать сигналы предоставляемые QItemSelectionModel? Там есть все нужное. ООП же, не надо все сваливать в один класс: композиция и взаимодействие! :)
Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: spectre71 от Июнь 24, 2009, 08:12 Ну и что мешает задействовать сигналы предоставляемые QItemSelectionModel? Там есть все нужное. ООП же, не надо все сваливать в один класс: композиция и взаимодействие! :) С сигналами от View на запрос к модели для возможной смены селекции я согласен, но политика селекции зависит от не от View, а от базовых данных модели. А QItemSelectionModel это уровень View, но не модели. 1) Данные могут не позволять делать определенного вида селекции. 2) Данные могут нести изначально свою селекцию и обязаны поддерживать ее актуальной. Например, у меня есть списочные данные которые если список не пуст обязаны иметь актуальный ItemIndex >= 0. И даже при установке модели с такими данными во View приходится делать танец с бубном: - Создаем модель, устанавливаем в нее данные(или создаем модель от данных) - Устанавливаем модель во View - Запрашиваем у данных их текущую селекцию и устанавливаем ее в SelectionModel, при этом иногда необходимо блокировать обратную связь от SelectionModel на смену селекции. - При смене селекции у данных вне View, где-то в другом месте, танец повторяется. 3) Смена селекции у данных может происходить не только через View, но и другими способами. Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: Barmaglodd от Июнь 24, 2009, 08:23 А по-моему всё логично: нет модели, нечего выделять.
@spectre71 Я в аналогичном случае, сделал класс контроллер, который перемещает строки, и класс контроллер, который следит за тем, какие операции доступны. Я их могу в разных вариантах с разными моделями комбинировать, а вам придётся втыкать одинаковый код в каждую модель. Не зря же придумали MVC, а вы хотите модель и контроллер объединить, вот и получаются проблемы. Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: Rcus от Июнь 24, 2009, 08:23 Эмм а что если эти функции реализовать в наследнике QItemSelectionModel?
Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: spectre71 от Июнь 24, 2009, 08:37 Эмм а что если эти функции реализовать в наследнике QItemSelectionModel? QItemSelectionModel - это уровень View, а не модели(данных). Это примерно так же неправильно как запихивать данные в наследника View.Данные и модель должны регулировать политику селекции, и некоторое поведение View, а не наоборот. И опять же модель(данные) не знает о SelectionModel(даже о специализированной), управлять селекцией должна модель(данные), а не примочка сверху. Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: Rcus от Июнь 24, 2009, 08:54 Да, отклонились мы от темы.
Я считаю что данные не должны задавать сложную логику их обработки, для этого есть контроллер (в Qt его в чистом виде нет, он размазан по QItemSelectionModel, делегатам и представлениям). Но поскольку наши подходы не совпадают похоже помочь в решении задачи я не смогу. Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: spectre71 от Июнь 24, 2009, 09:11 Да собственно помогать и не надо. Просто приходиться извращаться, что и делаем.
Название: Re: QItemSelectionModel * QTableView::selectionModel () const - BAG! Отправлено: ритт от Июнь 24, 2009, 16:27 так и не понял: при чём тут мешок?
|