Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ooki2day от Декабрь 27, 2014, 16:02



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


Название: Re: логика создания модели и делегата
Отправлено: Пантер от Декабрь 29, 2014, 09:06
Совершенно не так. Можель хранит только данные, а вот делегат создает виджеты для нужных данных. Посмотри примеры, которые поставляются с Кьютом.


Название: Re: логика создания модели и делегата
Отправлено: ooki2day от Январь 05, 2015, 02:28
хоть убей, не могу понять одну вещь. есть модель, как делегатом создать нужное кол-во виджетов? и павильно ли я понимаю, что остальные элементы этих виджетов (кнопки, лайнэдиты) создаются в QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const?


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

А куда у тебя установлен делегат?


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


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

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

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

Опиши свою задачу более подробно. Просто создается впечатление, что мы о разных понятиях говорим. Какая у тебя модель?
Куда она установлена (какое представление используется для показа данных)? Как ты устанавливаешь делегат в представление?


Название: Re: логика создания модели и делегата
Отправлено: ooki2day от Январь 06, 2015, 01:45
я понимаю что из модели отображается все в представлении. вопрос в том, как создать делегат для представления в виде виджета со всякими лейблами и кнопочками. или виджет тут нафик не нужен, и просто рисовать нужные компоненты?


Название: Re: логика создания модели и делегата
Отправлено: gil9red от Январь 06, 2015, 01:55
Переопределяете createEditor (http://qt-project.org/doc/qt-4.8/qitemdelegate.html#createEditor) и возвращаете указатель на виджет, который и будет содержать всякие лейблы и кнопки который вам нужно показать в представлении.

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


Название: Re: логика создания модели и делегата
Отправлено: ooki2day от Январь 06, 2015, 02:26
gil9red, спасибо тебе огромное) теперь разобрался со всем.


Название: Re: логика создания модели и делегата
Отправлено: gil9red от Январь 06, 2015, 02:43
gil9red, спасибо тебе огромное) теперь разобрался со всем.

 ;)


Название: Re: логика создания модели и делегата
Отправлено: ooki2day от Январь 06, 2015, 03:51
ну нет, не совсем все понятно. в примере со звездочками модель содержит виджет, а мне говорят что там должны быть только данные.
upd: все норм, по ходу спать надо)) не содержит она виджет


Название: Re: логика создания модели и делегата
Отправлено: ooki2day от Январь 06, 2015, 13:22
т.е. получается, что мне необходимо сперва в paint() рисоват свой виджет, а потом в createEditor() он создается поверх для редактирования? это норм?


Название: Re: логика создания модели и делегата
Отправлено: kambala от Январь 06, 2015, 21:44
в paint() ты рисуешь то, с чем не нужно взаимодействие (ну можно и виджет отрисовать). а в createEditor() возвращаешь полноценный виджет, который будет получать события.


Название: Re: логика создания модели и делегата
Отправлено: ooki2day от Январь 06, 2015, 23:43
т.е. это считается нормальным так делать? хорошо, тогда как будет более правильно? я попробовал через QWidget::grab(), но в этоге при создании эдитора не стыкуются правильно размеры. если через граб пойдет, то как бы грамотно обойти этот момент с размерами?


Название: Re: логика создания модели и делегата
Отправлено: kambala от Январь 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);
}


Название: Re: логика создания модели и делегата
Отправлено: ooki2day от Январь 07, 2015, 00:52
спасибо большое)


Название: Re: логика создания модели и делегата
Отправлено: ooki2day от Январь 07, 2015, 18:10
хм, а почему он при рендере неправильно рисует виджет по координатам x,y? т.е. если вместо 0,0 я укажу -13, -110 - рисуется нормально


Название: Re: логика создания модели и делегата
Отправлено: ooki2day от Январь 07, 2015, 19:07
нашел варианты решения моей проблемы. если кому пригодится http://toster.ru/q/39263


Название: Re: логика создания модели и делегата
Отправлено: kambala от Январь 07, 2015, 21:17
хм, а почему он при рендере неправильно рисует виджет по координатам x,y? т.е. если вместо 0,0 я укажу -13, -110 - рисуется нормально
у меня правильно все...