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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: логика создания модели и делегата  (Прочитано 8642 раз)
ooki2day
Гость
« : Декабрь 27, 2014, 16:02 »

Здравствуйте. Начал разбираться с моделями и делегатами, и встал вопрос о правильности использования. Значит, есть данные и QWidget с QTextEdit, Qlabel, QPushButton. Я делаю так: берем данные, вводим их в нужное количество виджетов, список виджетов отдаю в QAbstractListModel; затем, исользую для этой модели делегат, который ловит нажатие на кнопку и генерит сигнал. Скажите, правильна ли такая логика? И как она влияет на скорость обработки всего этого (т.е. есть ли более быстрые варианты?)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 29, 2014, 09:06 »

Совершенно не так. Можель хранит только данные, а вот делегат создает виджеты для нужных данных. Посмотри примеры, которые поставляются с Кьютом.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ooki2day
Гость
« Ответ #2 : Январь 05, 2015, 02:28 »

хоть убей, не могу понять одну вещь. есть модель, как делегатом создать нужное кол-во виджетов? и павильно ли я понимаю, что остальные элементы этих виджетов (кнопки, лайнэдиты) создаются в QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const?
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #3 : Январь 05, 2015, 04:05 »

Модель никакого отношения к QWidget не имеет. Модель работает с представлениями типа: QListView, QTableView, QTreeView.
А делегат нужен для того, чтобы удобнее было редактировать данные в представлении и записывать изменения в модель.

А куда у тебя установлен делегат?
« Последнее редактирование: Январь 05, 2015, 04:13 от PimenS » Записан
ooki2day
Гость
« Ответ #4 : Январь 05, 2015, 06:26 »

есть набор данных из БД. мне надо их отображать в виджете. грубый пример - стена вконакте: есть label отправителя, image, text, label date, comment. данные же берутся из БД в модель, создается делегат, в который добавляются данные из модели. правильно? так вот как создать делегат такой с лейблами и кнопками? точнее, я пытаюсь создать виджет для каждого итема модели, а в виджете создать мнопки и лейблы. вопрос в том, в каких наследованных методах от QStyledItemDelegate мне надо создавать виджет и все его наполнение?
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #5 : Январь 05, 2015, 09:01 »

есть набор данных из БД. мне надо их отображать в виджете. грубый пример - стена вконакте: есть label отправителя, image, text, label date, comment. данные же берутся из БД в модель, создается делегат, в который добавляются данные из модели. правильно? так вот как создать делегат такой с лейблами и кнопками? точнее, я пытаюсь создать виджет для каждого итема модели, а в виджете создать мнопки и лейблы. вопрос в том, в каких наследованных методах от QStyledItemDelegate мне надо создавать виджет и все его наполнение?

Есть набор данных, которыми заполняется модель. Модель установлена в представление (например QTableView). А у представления, на определенные колонки установлены делегаты.
Этот делегат позволяет определенным образом видеть и редактировать данные в этой колонке.

создается делегат, в который добавляются данные из модели. правильно?

Опиши свою задачу более подробно. Просто создается впечатление, что мы о разных понятиях говорим. Какая у тебя модель?
Куда она установлена (какое представление используется для показа данных)? Как ты устанавливаешь делегат в представление?
Записан
ooki2day
Гость
« Ответ #6 : Январь 06, 2015, 01:45 »

я понимаю что из модели отображается все в представлении. вопрос в том, как создать делегат для представления в виде виджета со всякими лейблами и кнопочками. или виджет тут нафик не нужен, и просто рисовать нужные компоненты?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Январь 06, 2015, 01:55 »

Переопределяете createEditor и возвращаете указатель на виджет, который и будет содержать всякие лейблы и кнопки который вам нужно показать в представлении.

Примеры из коробки:
http://qt-project.org/doc/qt-4.8/itemviews-spinboxdelegate.html
http://qt-project.org/doc/qt-4.8/itemviews-stardelegate.html
Записан

ooki2day
Гость
« Ответ #8 : Январь 06, 2015, 02:26 »

gil9red, спасибо тебе огромное) теперь разобрался со всем.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Январь 06, 2015, 02:43 »

gil9red, спасибо тебе огромное) теперь разобрался со всем.

 Подмигивающий
Записан

ooki2day
Гость
« Ответ #10 : Январь 06, 2015, 03:51 »

ну нет, не совсем все понятно. в примере со звездочками модель содержит виджет, а мне говорят что там должны быть только данные.
upd: все норм, по ходу спать надо)) не содержит она виджет
« Последнее редактирование: Январь 06, 2015, 03:53 от ooki2day » Записан
ooki2day
Гость
« Ответ #11 : Январь 06, 2015, 13:22 »

т.е. получается, что мне необходимо сперва в paint() рисоват свой виджет, а потом в createEditor() он создается поверх для редактирования? это норм?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Январь 06, 2015, 21:44 »

в paint() ты рисуешь то, с чем не нужно взаимодействие (ну можно и виджет отрисовать). а в createEditor() возвращаешь полноценный виджет, который будет получать события.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ooki2day
Гость
« Ответ #13 : Январь 06, 2015, 23:43 »

т.е. это считается нормальным так делать? хорошо, тогда как будет более правильно? я попробовал через QWidget::grab(), но в этоге при создании эдитора не стыкуются правильно размеры. если через граб пойдет, то как бы грамотно обойти этот момент с размерами?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Январь 07, 2015, 00:02 »

пример отрисовки виджета из проекта:
Код
C++ (Qt)
void FeedItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   QPaintDevice *paintDeviceOriginal = painter->device();
 
   auto r = option.rect;
   FeedItemWidget w;
   w.setGeometry(r);
 
   // заполняешь виджет данными
 
   painter->end();
   w.render(painter->device(), r.topLeft(), QRegion(0, 0, r.width(), r.height()), QWidget::RenderFlag::DrawChildren);
   painter->begin(paintDeviceOriginal);
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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