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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Как перейти в режим редактирования таблицы?  (Прочитано 8178 раз)
Chester
Гость
« Ответ #15 : Февраль 15, 2010, 11:12 »

Здраствуйте...Воспользовался Вашим советом
тогда системмная ошибка вылазиет...
Хм, какая?
Вообще, лучше фрейм и спинбокс агрегировать в один виджет, предоставив необходимый функционал. А то в методах setEditorData() и setModelData() надо будет копать до QDoubleSpinBox, что как-то не очень.

Все нормально вроде работало...и вот бнаружился такой касяк...почему-то мой виджет переопределенный не получает фокус ввода. И вообще такое ощущение,что он ложится поверх обычного QDoubleSpinBox,который и получает фокус ввода. Вот как я создаю свой виджет:
Код
C++ (Qt)
class EditWidg : public QWidget{
 Q_OBJECT
 public:
   EditWidg(QWidget *parent = 0): QWidget(parent){
     fr=new QFrame(this);
       fr->setFrameShape(QFrame::Box);
       fr->setFrameShadow(QFrame::Sunken);
       fr->setFixedSize(105,32);
     dsb = new QDoubleSpinBox(fr);
       dsb->setMinimum(0.0);
       dsb->setMaximum(999999.99);
       dsb->setDecimals(2);
       dsb->setSingleStep(1);
       dsb->setFixedSize(98,22);
     QGridLayout *gridLayout = new QGridLayout(fr);
       gridLayout->setContentsMargins(1, 0, 3, 0);
       gridLayout->addWidget(dsb, 0, 0, 1, 1);
   }
   ~EditWidg(){}
   void setValue(double d){
      dsb->setValue(d);
   }
   double value(){
      return dsb->value();
   }
   void interpretText(){
      dsb->interpretText();
   }
   QFrame *fr;
   QDoubleSpinBox *dsb;
};
class MyDSBDelegate : public QItemDelegate{
 Q_OBJECT
 public:
   MyDSBDelegate(QObject *parent=0):QItemDelegate(parent){}
   ~MyDSBDelegate(){}
  QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &/*option*/,const QModelIndex &/*index*/) const{
    EditWidg *editor=new EditWidg(parent);
    editor->installEventFilter(const_cast<MyDSBDelegate*>(this));
    return editor;
  }
  void setEditorData(QWidget *editor,const QModelIndex &index) const{
    double value = index.model()->data(index, Qt::EditRole).toDouble();
    EditWidg *dsb = static_cast<EditWidg*>(editor);
    dsb->setValue(value);
  }
  void setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index) const{
     EditWidg *dsb = static_cast<EditWidg*>(editor);
     dsb->interpretText();
     double value = dsb->value();
     model->setData(index, value);
  }
  void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index) const{
      editor->setGeometry(option.rect);
  }
};
 
Записан
Chester
Гость
« Ответ #16 : Февраль 15, 2010, 15:41 »

Видимо все-таки дело в определенном мною виджете,унаследованном от QWidget..такой виджет вообще можно использовать в определении делегата??
Записан
Chester
Гость
« Ответ #17 : Февраль 15, 2010, 21:46 »

Получается,что в качестве редактора передается QWidget,на которм расположен фрейм и спинбокс и который,как я понимаю, не имеет фокуса ввода...как же сделать чтобы фокус ввода передавался бы спин боксу...
Записан
Chester
Гость
« Ответ #18 : Февраль 16, 2010, 08:43 »

Вот блин,бьюсь уже над этим целый день...
Хочу чтобы у меня спинбокс был не на всю ячейку,как он по стандартному, а чтоб между ним и границами было какое-то расстояние...
Подскажите пожалуйста как все-таки это лучше организовать???Можт лучше вообще не создавать собственный виджет??
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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