Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разные редакторы для одного типа в модели, разные редакторы для одного типа данных 
:(
    Опции темы
olegkuzn
Дата 4.7.2012, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Здраствуйте.
Помогите решить вопрос.

Код


// конструктор класса MyDeleg производного от  QItemDelegate
// создан почти как по примеру
MyDeleg::MyDeleg(QObject *parent)
       : QItemDelegate(parent)
{
    m_itemFactory = new QItemEditorFactory(); 
    QItemEditorCreatorBase* intWidget  = new QStandardItemEditorCreator<MySpinBox>();
    m_itemFactory->registerEditor(QVariant::Int,  intWidget );
    
    setItemEditorFactory(m_itemFactory);
}



После этого при редактировании данных класса int используется объект класса MySpinBox.
Можно ли сделать так, чтобы в разных случаях для разных данных int вызывался свой редактор 
(Например QComboBox, производный от QLineEdit и т.д.) ?
Если можно то как это сделать.

Заранее спасибо.
PM MAIL   Вверх
borisbn
Дата 4.7.2012, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(olegkuzn @  4.7.2012,  19:40 Найти цитируемый пост)
Можно ли сделать так, чтобы в разных случаях для разных данных int вызывался свой редактор 
(Например QComboBox, производный от QLineEdit и т.д.) 

три раза перечитал.... ИМХО набор букафф.... перефразируй, чтобы попонятней было


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
olegkuzn
Дата 4.7.2012, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Извините. Постараюсь все переформулировать.

1. Класс QItemDelegate содержит методы :

QItemEditorFactory * QItemDelegate::itemEditorFactory () const // возвращает укзатель на объект типа QItemEditorFactory
void QItemDelegate::setItemEditorFactory ( QItemEditorFactory * factory ) // устанавливает свойство типа QItemEditorFactory

2.  QItemEditorFactory - Класс который предоставляет виджеты для редактирования данных в представлениях через делегат.
    (При редактировании данных элемента модели в представлении будет использоваться тот виджет который указан в QItemEditorFactory )

3. Класс QItemEditorFactory содержит набор объектов производных от QItemEditorCreatorBase.

4. Объекты класса производного от QItemEditorCreatorBase являются редакторами для каждого конкретного типа данных хранимых в QVariant.
    (Модели данных хранят данные в виде QVariant) 

В моем случае:
1. Создается объект класса QItemEditorFactory                                      - m_itemFactory = new QItemEditorFactory(); 
2. Создается специализированный редактор основанный на QSpinBox   - QItemEditorCreatorBase* intWidget  = new QStandardItemEditorCreator<MySpinBox>();
3. Этот редактор регистрируется как редактор типа QVariant::Int          - m_itemFactory->registerEditor(QVariant::Int,  intWidget );
4. Объект класса QItemEditorFactory устанавливается в делегате           - setItemEditorFactory(m_itemFactory);

Но разные элементы модели типа QVariant::Int необходимо редактировать разными редакторами (не только производными от <MySpinBox>).
Можно ли как-нибудь обойти это препятствие  (Например использовать в QVariant пользовательские типы.) или нет. И если можно то как это сделать.

Надеюсь сейчас вопрос будет понятнее.


PM MAIL   Вверх
math64
Дата 5.7.2012, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Кроме названных тобой методов, в QItemDelegate есть ещё:
Код

    virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    virtual void setEditorData(QWidget *editor, const QModelIndex &index) const;
    virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;

обычно они и переопределяются, чтобы изменить поведение QItemDelegate.
PM   Вверх
olegkuzn
Дата 5.7.2012, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Первоначально так было и сделано. 
Просто хотел попробовать сделать тоже самое с помощью QItemEditorFactory.
(Хотел избежать длинных операторов switch{case... case...})

PM MAIL   Вверх
math64
Дата 5.7.2012, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Чтобы избавиться от длинных switch, можно задать разные QItemDelegate для разных колонок таблицы.
Соответственно, переопределяя createEditor() или задавая разные QItemEditorFactory (во втором случае производый класс от QItemDelegate делать не обязательно)
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.