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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView остаются артефакты делегатов при смене модели  (Прочитано 6240 раз)
MedEx
Гость
« : Август 13, 2012, 21:41 »

Раньше работал 1 представление - 1 модель. Понадобилось в представлении менять модели (подгружать данные из базы). Для модели набор делегатов к столбцам чекбоксы, нередактируемый листедит, комбобоксы. Меняю модель, данные новые, а делегаты на прежних позициях. Вероятно они где-то прописываются в представлении, а вот как его очистить решения я пока не нашёл...ну разве что создавать новое представление. Если камрады сталкивались с таким подводным камнем прошу поделиться решением!
Записан
Bepec
Гость
« Ответ #1 : Август 14, 2012, 06:54 »

Делегаты ставятся на представление. На ячейки.

Чтобы их оттуда убрать их надо оттуда выдрать.

К модели делегаты имеют отношения смутные и невнятные Улыбающийся
Записан
MedEx
Гость
« Ответ #2 : Август 14, 2012, 08:29 »

Логично, а есть ли способы добраться к сетке?
Записан
Bepec
Гость
« Ответ #3 : Август 14, 2012, 08:42 »

К какой сетке? Если про разделители ячеек - они спокойно отключаются/включаются. Методы стандартные.
Записан
MedEx
Гость
« Ответ #4 : Август 14, 2012, 08:46 »

Как я понял проблему, необходимо установить количество столбцов равное 0. В QTableWidget это setColCount(int). А в QTableView что-то немогу найти ничего похожего и гугл молчит. Либо изменить записанную в представлении привязку делегатов, тоесть извлечь их, вопрос как?
« Последнее редактирование: Август 14, 2012, 08:50 от MedEx » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #5 : Август 14, 2012, 09:06 »

Смутно понятен вопрос. Количество столбцов устанавливается в модели, а не в представлении. Минимально компилируемый проект в аттаче поможет глубже вникнуть в вашу проблему )
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
MedEx
Гость
« Ответ #6 : Август 14, 2012, 09:53 »

Легко, любой пример по QTableView. Присваиваем модель и делегат столбцу. Присваиваем другую модель (другого формата столбцов и строк), делегат на прежнем месте.

В аттаче стандартный пример из book, сначала грузим модель 2(с чекбоксом), затем модель 1 (без чекбокса) а чекер на месте.

Глубины 0, просто изъять делегат из представления.
« Последнее редактирование: Август 14, 2012, 11:05 от MedEx » Записан
MedEx
Гость
« Ответ #7 : Август 14, 2012, 11:16 »

Костылик был найден
http://www.qtcentre.org/threads/34464-Persistent-(changing)-model-and-delegate-deletion
Код:
// Get the current delegate
        for(int i=0;i<table->model()->columnCount();i++)
        {
            QStyledItemDelegate* delegate = (QStyledItemDelegate*)table->itemDelegateForColumn( i );
            // Remove the delegate from the view
            table->setItemDelegateForColumn( i, NULL );
            delete delegate;
        }
Криво как свинячья пиписька но работает.
Записан
Странник
Гость
« Ответ #8 : Август 14, 2012, 11:32 »

другого метода и нет, если вам необходимо удалять делегаты. непонятно разве что, почему автор стесняется удалить QAbstractItemDelegate *.
либо, если модели меняются очень часто, можете хранить список указателей на делегаты для колонок в каком-нибудь QMap<int, QAbstractItemDelegate *>, чтобы лишний раз потом не пересоздавать объекты, а очищать делегаты для представления с помощью setItemDelegate.
Записан
MedEx
Гость
« Ответ #9 : Август 14, 2012, 12:47 »

Код:
// Get the current delegate
        if(table->model())
        for(int i=0;i<table->model()->columnCount();i++)
        {
            QAbstractItemDelegate* delegate = table->itemDelegateForColumn( i );
             //Remove the delegate from the view
            table->setItemDelegateForColumn( i, NULL );
            delete delegate;
        }
Да Странник прав, так правильно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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