crossplatform.ru

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


  Ответ в Проблемы с делегатом
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Patricul Дата 15.8.2011, 22:01
  Спасибо Litkevich Yuriy! Я просто изначально упустил геометрию, а потом в отчаянии начал химичить! Спасиб...
Litkevich Yuriy Дата 15.8.2011, 17:49
  вообще делегат для заданной колонки устанавливается так:
void QAbstractItemView::setItemDelegateForColumn ( int column, QAbstractItemDelegate * delegate ) ни какой химии с номером колонок в собственном делегате не нужно.
Мне даже лень вникать в твой код.

П.С.
Если б ты руководство читал внимательно, то врятли бы так нахимичил.
Patricul Дата 15.8.2011, 17:42
 
Цитата(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, 16:09
 
Цитата(Patricul @ 15.8.2011, 17:54) *
Почему я не могу вставить этот делегат сразу для двух колонок?
а что значит не могу? И что значит не работает?

Руководство читал?
Patricul Дата 15.8.2011, 14:54
 
Цитата(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, 6:50
 
Цитата(Patricul @ 15.8.2011, 3:13) *
Причина в этом?
ну геометрия не задана, вот виджет и отображается в начале родителя.
Patricul Дата 15.8.2011, 0:13
 
Цитата(Litkevich Yuriy @ 12.8.2011, 19:27) *
Цитата(Patricul @ 12.8.2011, 16:07) *
MyDEDelegate::updateEditorGeometry
А где?

Причина в этом?
Litkevich Yuriy Дата 12.8.2011, 18:27
 
Цитата(Patricul @ 12.8.2011, 16:07) *
MyDEDelegate::updateEditorGeometry
А где?
Patricul Дата 12.8.2011, 13:07
  Столкнулся со следующей проблемой!
Пытаюсь внедрить делегат на изменение времени в свой проект:
В конструкторе подключаю:
  
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.
Заранее спасибо...
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 15:05