crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Делегаты..., Использование...
LE0N
  опции профиля:
сообщение 24.3.2009, 9:59
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вобщем написал собственный делегат для отображения даты из бд в таблице (данные даты храню в инте)....
Вот его код:
Раскрывающийся текст
/*
* DateDelegate.cpp
*
*  Created on: 24.03.2009
*      Author: FlyGuy
*/
#include <QtGui>
#include "DateDelegate.h"

DateDelegate::DateDelegate(QObject *p):QItemDelegate(p) {

}
QWidget *
DateDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) {
    QDateEdit *editor=new QDateEdit(parent);
    editor->installEventFilter(const_cast<DateDelegate*>(this));
    return editor;
}
void
DateDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const {
    QDate value=index.model()->data(index,Qt::EditRole).toDate();
    QDateEdit *d = static_cast<QDateEdit*>(editor);
    d->setDate(value);
}
void
DateDelegate::setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index){
    QDateEdit *d = static_cast<QDateEdit*>(editor);
    model->setData(index,d->date().toJulianDay());
}
void
DateDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index) {
    editor->setGeometry(option.rect);
}
DateDelegate::~DateDelegate() {
    // TODO Auto-generated destructor stub
}

Подключаю его к вьюхе:
Раскрывающийся текст
    operations=new QSqlRelationalTableModel(this,db);
    operations->setTable("store_operations");
    operations->setRelation(1,QSqlRelation("users","id","name"));
    operations->setRelation(2,QSqlRelation("operations_name","id","name"));
    operations->setFilter("store_id=-1");
    operations->select();

    ui.tableView_3->setModel(operations);
    ui.tableView_3->setAlternatingRowColors(1);
    ui.tableView_3->setItemDelegateForColumn(4,new DateDelegate(ui.tableView_3));
    ui.tableView_3->hideColumn(0);
    ui.tableView_3->hideColumn(3);

Но дата всё так же отображается как число....
Что не так у меня с пониманием этих самых делегатов?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 24.3.2009, 15:02
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Люди, ай ниид хелп :(
Ибо у меня сейчас стопор полный :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.3.2009, 19:30
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(LE0N @ 24.3.2009, 15:02) *
Люди, ай ниид хелп :(
Ибо у меня сейчас стопор полный :(

Для отображения, через делегат нужно переопределять paint и рисовать в нем нужную дату.
Проще в самой моделе переопределить метод data и при разных ролях возвращать разные значения, а делегату оставить редактирование.
В модели при роле DisplayRole возвращать строку даты преобразованную из int, а при EditRole возвращать сам int.
Для сохранения переопределить в модели setData для роли EditRole.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.3.2009, 20:02
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(LE0N @ 24.3.2009, 12:59) *
Вобщем написал собственный делегат для отображения даты из бд в таблице
а чем тебя стандартный делегат не устроил?

из-за этого:
Цитата(LE0N @ 24.3.2009, 12:59) *
d->date().toJulianDay()
?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 24.3.2009, 20:17
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Брррр. Не понял, т.е. делегаты нужны только для редактирования?
Они не имеют ни какого отношения к отображению? :(
Цитата
а чем тебя стандартный делегат не устроил?
из-за этого:

Да я хотел стандартизировать вьюху. Если мне в ней нужно было бы вывести в каком-нибудь поле с датой, я тупо устанавливал бы этого делегата....
Что бы копи-пастом не заниматься....

Я вообще думал (по логике вещей). Когда я устанавливаю делегата, при отрисовке, в нужной ячейке, вьюха сама вызывает editor->show()....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.3.2009, 20:28
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(LE0N @ 24.3.2009, 23:17) *
Когда я устанавливаю делегата, при отрисовке, в нужной ячейке, вьюха сама вызывает editor->show()....
редактор будет показыватся, только при входе в режим редактирования, тебе это надо было или просто отображение теста, не во время редактирования?

Я задачу нескользо не пойму. Стандартный делегат нормально отображает дату.

Цитата(LE0N @ 24.3.2009, 23:17) *
Не понял, т.е. делегаты нужны только для редактирования?
нет, но для разных ситуаций нужно в делегате реализовать разные функции.

Например для редактирования нужны те функции, которые ты уже реализовал. А для рисования ячейки, не во время редактирования нужно реализовать методы рисования (paint). Посмотри статью: Разработка делегатов
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.3.2009, 20:31
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(LE0N @ 24.3.2009, 20:17) *
Брррр. Не понял, т.е. делегаты нужны только для редактирования?
Они не имеют ни какого отношения к отображению? :(

Для отображения низкого уровня, с помощью делегата можно рисовать в ячейке что хочешь (переопределяя метод paint).

Цитата(LE0N @ 24.3.2009, 20:17) *
Я вообще думал (по логике вещей). Когда я устанавливаю делегата, при отрисовке, в нужной ячейке, вьюха сама вызывает editor->show()....

editor используется только во время редактирования.

На самом деле, если ты чуть глубже разберешся с model/view + delegate, то поймешь что все сделано нормально и логично. Потерпи. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 24.3.2009, 20:32
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
редактор будет показыватся, только при входе в режим редактирования, тебе это надо было или просто отображение теста, не во время редактирования?

Вообще - будут разные ситуации. Иногда - редактирование будет запрещено, иногда - разрешено....В зависимости от прав пользователя...
Цитата
Я задачу нескользо не пойму. Стандартный делегат нормально отображает дату.

Нормально. Ни кто не спорит. Просто у меня дата в БД хранится в int....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.3.2009, 20:50
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(LE0N @ 24.3.2009, 20:32) *
Нормально. Ни кто не спорит. Просто у меня дата в БД хранится в int....

А какой моделью пользуешся?
Можно из БД брать int, а из data() конвертировать и возвращать QDate.
Тогда правда делегат твой не понадобится. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 24.3.2009, 20:54
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Странно, конечно, но включив редактирование - у меня ситуация лучше не стала. Теперь дата у меня устанавливается в ноль. (Скорее всего потому, что там она в инт формате ) Но я ведь явно в делегате указываю дату для эдитора....Ни хрена не понимаю...
Цитата
А какой моделью пользуешся?

operations=new QSqlRelationalTableModel(this,db);
Можно, конечно, и переопределить data....НО! Для каждой новой таблицы и модели переопределять ячейки? У меня таблиц штук 10 с датами. Но с разными данными...
Для каждой модели переопределять методы? Это же целая куча копи-паста :(

Сообщение отредактировал LE0N - 24.3.2009, 20:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.2.2025, 15:02