Russian Qt Forum
Ноябрь 01, 2024, 04:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QStandardItemModel. Убрать editable по умолчанию.  (Прочитано 10447 раз)
Flake
Гость
« : Март 16, 2009, 16:45 »

Здравствуйте.
Для QTreeView я использую QStandardItemModel. По умолчанию все элементы можно редактировать. Как это убрать?
Как менять флаги или установить возможность редактирования что-то не нашёл.

Вроде бы в ассистанте нашёл что надо переопределить flags, но это для QAbstractItemModel.
И ещё надо сделать возможным редактировать только отдельные столбцы.

Как это всё реализовать?

И ещё подвопрос. После изменения в ячейке надо проверить - изменилось ли это значение по сравнению с предыдущим, и соответственно подсвечивать это дело. Так вот где хранить предыдущее значение? Под ролью Qt::UserRole? Правильно ли так делать?
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Март 16, 2009, 17:19 »

Что мешает унаследоваться от QAbstractItemModel?

Переопределяешь метод flags для QAbstractItemModel. Внутри этого метода делашь логику, как должна обрабатываться нужная ячейка. А какая это ячейка - выясняешь из принятого в метод значения index.

Пример

Код:
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
 if(index.row()==0)
  return ItemIsEnabled;
 else
  return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}



Предыдущее значение можно хранить под ролью Qt::UserRole. И можно сравнивать. Но подумай, надо ли тебе это? Ты можешь не предыдущее значение хранить, а просто бинарный флаг что значение было изменено.
Записан

Собираю информацию по крупицам
http://webhamster.ru
BRE
Гость
« Ответ #2 : Март 16, 2009, 17:25 »

Что мешает унаследоваться от QAbstractItemModel?
Если наследоваться от QAbstractItemModel, то необходимо переопределить еще несколько методов (т.е. сделать новую модель).
А вот что мешает унаследоваться от QStandartItemModel и переопределить flags() как надо для меня загадка.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Март 16, 2009, 17:43 »

Да, что-то я тормознул. У QStandardItemModel есть метод flags(). Товарищу Flake надыть жмякнуть в ассистенте на список всех членов, включая унаследованные для QStandardItemModel. Там он увидит что flags() есть. А есть этот метод потому, что QStandardItemModel наследуется от QAbstractItemModel.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Flake
Гость
« Ответ #4 : Март 16, 2009, 17:54 »

Спасибо с этим вопросом ясно.

А что касается подсветки в плане реализации? Нашёл что надо установить делегат и переписать paint.
Унаследовал я значит класс от QItemDelegate. Но вот столкнулся с вопросом - как в createEditor установить виджет, чтобы прям в нём текст писать, как стандартно? Может у кого пример есть или ткните куда Улыбающийся
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #5 : Март 16, 2009, 18:12 »

Выделять цветом можно так. В методе data пишешь логику, которая в зависимости от запрашиваемой роли возвращает цвет. Пример

Код:
QVariant TreeModel::data(const QModelIndex &index, int role) const
{
    // Если индекс невалиден, возвращается пустой элемент
    if(!index.isValid())return QVariant();

    // Если запрашивается окраска текста элемента
    if(role==Qt::ForegroundRole)
    {
     TreeItem *item = getItem(index);

     // Логика, как нада окрашивать элементы
     if(item->recordtable_getrowcount()>0)
      return Qt::black;
     else
      return Qt::darkGray;
    }

    // Если запрашивается содержимое текста элемента
    if(role==Qt::DisplayRole || role== Qt::EditRole)
    {
     TreeItem *item = getItem(index);
     return item->data();
    }

    // Во всех остальных случаях возвращается пустой элемент
    return QVariant();
}
Записан

Собираю информацию по крупицам
http://webhamster.ru
nn1317
Гость
« Ответ #6 : Март 17, 2009, 00:59 »

правильного ответа не дал никто) (в рамках моего понимания задачи!)
месяц назад тоже столкнулся. все очень просто, не нужно ни от кого наследоваться. нужно для виджета(у меня QTreeView) вызвать setEditTriggers(QAbstractItemView::NoEditTriggers);
Записан
BRE
Гость
« Ответ #7 : Март 17, 2009, 08:04 »

правильного ответа не дал никто) (в рамках моего понимания задачи!)
месяц назад тоже столкнулся. все очень просто, не нужно ни от кого наследоваться. нужно для виджета(у меня QTreeView) вызвать setEditTriggers(QAbstractItemView::NoEditTriggers);

В первом посте Flake писал:
Цитировать
И ещё надо сделать возможным редактировать только отдельные столбцы.

Ты запрещаещь редактирования всего view'a, конечно это более правильное решение.  Подмигивающий
Записан
nn1317
Гость
« Ответ #8 : Март 17, 2009, 11:11 »

>И ещё надо сделать возможным редактировать только отдельные столбцы.
не заметил))
Записан
Flake
Гость
« Ответ #9 : Март 17, 2009, 17:02 »

Возник вопрос к xintrea, по поводу строки в примере:
Код:
TreeItem *item = getItem(index);
Не совсем понял откуда это всё взялось?

Заменил на:
Код:
QStandardItem *item = this->itemFromIndex(index);

Но данные не выводятся.
Записан
Jokerochek
Гость
« Ответ #10 : Март 17, 2009, 19:14 »

Для QTreeView я использую QStandardItemModel. По умолчанию все элементы можно редактировать. Как это убрать?
Как менять флаги или установить возможность редактирования что-то не нашёл.
Может не лучший способ. Но я сделал делегата, который запрещал редактирование элемента и вешал его на столбцы, или отдельные элементы.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #11 : Март 17, 2009, 22:23 »

Возник вопрос к xintrea, по поводу строки в примере:
Код:
TreeItem *item = getItem(index);
Не совсем понял откуда это всё взялось?

Это же пример. getItem() - это мой самодельный метод, который получает данные из дерева по индексу. Каким способом у тебя данные будут в этом месте возвращаться - из SQL базы, из массива, генериться на лету - это зависит от тебя. Для древовидных данных есть пример /examples/itemviews/simpletreemodel, там эта функциональность находится в treemodel.cpp, в методе data(). А я себе вынес отдельно.

Код:
// Получение указателя на Item-злемент связанный с заданным QModelIndex
TreeItem *TreeModel::getItem(const QModelIndex &index) const
{
    if (index.isValid()) {
        TreeItem *item = static_cast<TreeItem*>(index.internalPointer());

        if (item) return item;
    }

    return rootItem;
}


Заменил на:
Код:
QStandardItem *item = this->itemFromIndex(index);
Но данные не выводятся.

Я этим методом ниразу не пользовался, посему чотам неработает не знаю.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Flake
Гость
« Ответ #12 : Март 23, 2009, 18:01 »

...
Предыдущее значение можно хранить под ролью Qt::UserRole. И можно сравнивать. Но подумай, надо ли тебе это? Ты можешь не предыдущее значение хранить, а просто бинарный флаг что значение было изменено.
Извиняюсь что поднимаю тему. А где хранить этот бинарный флаг? В ячейке под Qt::UserRole? Или есть ещё какие-нибудь варианты?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.254 секунд. Запросов: 23.