crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Проблемы с делегатом, Делегат времени
Patricul
  опции профиля:
сообщение 12.8.2011, 13:07
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 1.8.2011
Пользователь №: 2779

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




Репутация:   0  


Столкнулся со следующей проблемой!
Пытаюсь внедрить делегат на изменение времени в свой проект:
В конструкторе подключаю:
  
m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_enteringdate, this)); // номер столбца и виджет
m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_sakingdate, this));

Но при клике на соответствующий индекс (в моём случае Дата увольнения) у меня происходит следующая картина:
Почему-то редактирование смещается в индекс с значениями 0 (row) и 0 (column). И мне непонятно почему так происходит...


Код делегата:
  
class MyDEDelegate : public QItemDelegate
{
        Q_OBJECT
   public:
        MyDEDelegate(int durationColumn,
                    QObject *parent = 0);
      QWidget *createEditor( QWidget *parent,  const QStyleOptionViewItem &option,
                                  const QModelIndex &index) const;
       void setEditorData(QWidget *editor,  const QModelIndex &index) const;

       void setModelData(QWidget *editor, QAbstractItemModel *model,
                                    const QModelIndex &index) const;
       void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,
                                    const QModelIndex &index) const;

    private:
       bool m_calpopup;
       int durationColumn;
  };


  
MyDEDelegate::MyDEDelegate( int durationColumn, QObject *parent)  : QItemDelegate(parent)


       {
      this->durationColumn = durationColumn;

       }

      QWidget *MyDEDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option,
                                                            const QModelIndex &index ) const
      {
      if (index.column() == durationColumn)
      {
       QDateEdit *editor = new QDateEdit(parent);
       editor->setCalendarPopup(m_calpopup);
       editor->installEventFilter(const_cast<MyDEDelegate*>(this));
       return editor;
      }
      else
       return QItemDelegate::createEditor(parent, option, index);
       }

     void MyDEDelegate::setEditorData( QWidget *editor, const QModelIndex &index) const
    {
      if(index.column() == durationColumn)
     {
     QDate value = index.model()->data(
               index, Qt::EditRole).toDate();
      QDateEdit *de = static_cast<QDateEdit*>(editor);
       de->setDate(value);
     }
      else
          QItemDelegate::setEditorData(editor, index);
     }

    void MyDEDelegate::setModelData( QWidget *editor, QAbstractItemModel *model,  
                                        const QModelIndex& index) const

        {
       if(index.column() == durationColumn)
        {
           QDateEdit *de = static_cast<QDateEdit*>(QDate::currentDate(),editor);
      de->interpretText();
      QDate value  = de->date();
       model->setData(index, value);
     }
       else
         QItemDelegate::setModelData(editor, model, index);

    }

   void MyDEDelegate::updateEditorGeometry(
               QWidget *editor,
             const QStyleOptionViewItem &option,
              const QModelIndex& /* index */) const {
}


И ещё меня интересует вопрос! Можно ли подкдючать один и тот же делегат сразу к двум индексам? Не то он у меня работает только при изменении индекса working_sakingdate.
Заранее спасибо...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.8.2011, 18:27
Сообщение #2


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

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

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




Репутация:   94  


Цитата(Patricul @ 12.8.2011, 16:07) *
MyDEDelegate::updateEditorGeometry
А где?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Patricul
  опции профиля:
сообщение 15.8.2011, 0:13
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 1.8.2011
Пользователь №: 2779

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 12.8.2011, 19:27) *
Цитата(Patricul @ 12.8.2011, 16:07) *
MyDEDelegate::updateEditorGeometry
А где?

Причина в этом?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.8.2011, 6:50
Сообщение #4


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

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

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




Репутация:   94  


Цитата(Patricul @ 15.8.2011, 3:13) *
Причина в этом?
ну геометрия не задана, вот виджет и отображается в начале родителя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Patricul
  опции профиля:
сообщение 15.8.2011, 14:54
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 1.8.2011
Пользователь №: 2779

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 15.8.2011, 7:50) *
Цитата(Patricul @ 15.8.2011, 3:13) *
Причина в этом?
ну геометрия не задана, вот виджет и отображается в начале родителя.

ок... нашёл решение...
  
  void MyDEDelegate::updateEditorGeometry(
               QWidget *editor,
             const QStyleOptionViewItem &option,
              const QModelIndex& /* index */) const
   {
        editor->setGeometry(option.rect);
}

Но теперь у меня вопрос! Почему я не могу вставить этот делегат сразу для двух колонок?

  
m_pTrackRecordView->setColumnHidden(working_Id, true);
m_pTrackRecordView->setColumnHidden(working_Idperson, true);


У меня он работает только на working_Idperson


Прошу прощения напутал! И данный делегат у меня работает только для колонки с working_sakingdate
  
m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_enteringdate, this));
m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_sakingdate, this));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.8.2011, 16:09
Сообщение #6


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

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

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




Репутация:   94  


Цитата(Patricul @ 15.8.2011, 17:54) *
Почему я не могу вставить этот делегат сразу для двух колонок?
а что значит не могу? И что значит не работает?

Руководство читал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Patricul
  опции профиля:
сообщение 15.8.2011, 17:42
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 1.8.2011
Пользователь №: 2779

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 15.8.2011, 17:09) *
Цитата(Patricul @ 15.8.2011, 17:54) *
Почему я не могу вставить этот делегат сразу для двух колонок?
а что значит не могу? И что значит не работает?

Руководство читал?

Да читал!
Нет тут фишка такая. Есть работающий делегат, который изменяет дату! Моя задача установить этот делегат в две ячейки таблицы (как я и сделал)
  
  m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_enteringdate, this));
  m_pTrackRecordView->setItemDelegate(new MyDEDelegate(working_sakingdate, this));

Но этот делегат работает ну и соответственно редактирует только в одной колонке working_sakingdate
А для колонки working_enteringdate актуально только стандартное редактирование (проще говоря Делегат по умолчанию).

Litkevich Yuriy если хотите можете сами посмотреть...

DataBase.rar
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.8.2011, 17:49
Сообщение #8


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

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

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




Репутация:   94  


вообще делегат для заданной колонки устанавливается так:
void QAbstractItemView::setItemDelegateForColumn ( int column, QAbstractItemDelegate * delegate ) ни какой химии с номером колонок в собственном делегате не нужно.
Мне даже лень вникать в твой код.

П.С.
Если б ты руководство читал внимательно, то врятли бы так нахимичил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Patricul
  опции профиля:
сообщение 15.8.2011, 22:01
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 1.8.2011
Пользователь №: 2779

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




Репутация:   0  


Спасибо Litkevich Yuriy! Я просто изначально упустил геометрию, а потом в отчаянии начал химичить! Спасиб...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 24.10.2019, 8:14