Название: QStandardItemModel. Убрать editable по умолчанию. Отправлено: Flake от Март 16, 2009, 16:45 Здравствуйте.
Для QTreeView я использую QStandardItemModel. По умолчанию все элементы можно редактировать. Как это убрать? Как менять флаги или установить возможность редактирования что-то не нашёл. Вроде бы в ассистанте нашёл что надо переопределить flags, но это для QAbstractItemModel. И ещё надо сделать возможным редактировать только отдельные столбцы. Как это всё реализовать? И ещё подвопрос. После изменения в ячейке надо проверить - изменилось ли это значение по сравнению с предыдущим, и соответственно подсвечивать это дело. Так вот где хранить предыдущее значение? Под ролью Qt::UserRole? Правильно ли так делать? Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: xintrea от Март 16, 2009, 17:19 Что мешает унаследоваться от QAbstractItemModel?
Переопределяешь метод flags для QAbstractItemModel. Внутри этого метода делашь логику, как должна обрабатываться нужная ячейка. А какая это ячейка - выясняешь из принятого в метод значения index. Пример Код: Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const Предыдущее значение можно хранить под ролью Qt::UserRole. И можно сравнивать. Но подумай, надо ли тебе это? Ты можешь не предыдущее значение хранить, а просто бинарный флаг что значение было изменено. Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: BRE от Март 16, 2009, 17:25 Что мешает унаследоваться от QAbstractItemModel? Если наследоваться от QAbstractItemModel, то необходимо переопределить еще несколько методов (т.е. сделать новую модель).А вот что мешает унаследоваться от QStandartItemModel и переопределить flags() как надо для меня загадка. Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: xintrea от Март 16, 2009, 17:43 Да, что-то я тормознул. У QStandardItemModel есть метод flags(). Товарищу Flake надыть жмякнуть в ассистенте на список всех членов, включая унаследованные для QStandardItemModel. Там он увидит что flags() есть. А есть этот метод потому, что QStandardItemModel наследуется от QAbstractItemModel.
Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: Flake от Март 16, 2009, 17:54 Спасибо с этим вопросом ясно.
А что касается подсветки в плане реализации? Нашёл что надо установить делегат и переписать paint. Унаследовал я значит класс от QItemDelegate. Но вот столкнулся с вопросом - как в createEditor установить виджет, чтобы прям в нём текст писать, как стандартно? Может у кого пример есть или ткните куда :) Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: xintrea от Март 16, 2009, 18:12 Выделять цветом можно так. В методе data пишешь логику, которая в зависимости от запрашиваемой роли возвращает цвет. Пример
Код: QVariant TreeModel::data(const QModelIndex &index, int role) const Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: nn1317 от Март 17, 2009, 00:59 правильного ответа не дал никто) (в рамках моего понимания задачи!)
месяц назад тоже столкнулся. все очень просто, не нужно ни от кого наследоваться. нужно для виджета(у меня QTreeView) вызвать setEditTriggers(QAbstractItemView::NoEditTriggers); Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: BRE от Март 17, 2009, 08:04 правильного ответа не дал никто) (в рамках моего понимания задачи!) В первом посте Flake писал:месяц назад тоже столкнулся. все очень просто, не нужно ни от кого наследоваться. нужно для виджета(у меня QTreeView) вызвать setEditTriggers(QAbstractItemView::NoEditTriggers); Цитировать И ещё надо сделать возможным редактировать только отдельные столбцы. Ты запрещаещь редактирования всего view'a, конечно это более правильное решение. ;) Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: nn1317 от Март 17, 2009, 11:11 >И ещё надо сделать возможным редактировать только отдельные столбцы.
не заметил)) Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: Flake от Март 17, 2009, 17:02 Возник вопрос к xintrea, по поводу строки в примере:
Код: TreeItem *item = getItem(index); Заменил на: Код: QStandardItem *item = this->itemFromIndex(index); Но данные не выводятся. Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: Jokerochek от Март 17, 2009, 19:14 Для QTreeView я использую QStandardItemModel. По умолчанию все элементы можно редактировать. Как это убрать? Может не лучший способ. Но я сделал делегата, который запрещал редактирование элемента и вешал его на столбцы, или отдельные элементы.Как менять флаги или установить возможность редактирования что-то не нашёл. Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: xintrea от Март 17, 2009, 22:23 Возник вопрос к xintrea, по поводу строки в примере: Код: TreeItem *item = getItem(index); Это же пример. getItem() - это мой самодельный метод, который получает данные из дерева по индексу. Каким способом у тебя данные будут в этом месте возвращаться - из SQL базы, из массива, генериться на лету - это зависит от тебя. Для древовидных данных есть пример /examples/itemviews/simpletreemodel, там эта функциональность находится в treemodel.cpp, в методе data(). А я себе вынес отдельно. Код: // Получение указателя на Item-злемент связанный с заданным QModelIndex Заменил на: Код: QStandardItem *item = this->itemFromIndex(index); Я этим методом ниразу не пользовался, посему чотам неработает не знаю. Название: Re: QStandardItemModel. Убрать editable по умолчанию. Отправлено: Flake от Март 23, 2009, 18:01 ... Извиняюсь что поднимаю тему. А где хранить этот бинарный флаг? В ячейке под Qt::UserRole? Или есть ещё какие-нибудь варианты?Предыдущее значение можно хранить под ролью Qt::UserRole. И можно сравнивать. Но подумай, надо ли тебе это? Ты можешь не предыдущее значение хранить, а просто бинарный флаг что значение было изменено. |