Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Chester от Январь 21, 2010, 12:02



Название: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Январь 21, 2010, 12:02
Добрый день!!!
Устанавливаю делегат для редактирования столбца в таблице...все нормально работает. И вот вопрос,как мне можно,например,перейти в режим редактирования не по двойному клику,как это стандартно реализовано,а например при нажатии соответствующей кнопки???Т.е. какой слот выплняет переход в режим редактирования таблицы?


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Авварон от Январь 21, 2010, 13:34
Код:
->setEditTriggers(QAbstractItemView::SelectedClicked);


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: crossly от Январь 21, 2010, 13:36
openRersistentEditor ?


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Авварон от Январь 21, 2010, 13:45
аааа, туплю... слот вообще
Код:
 void	edit ( const QModelIndex & index )
с опен персистент эдитор нужно самому закрывать его


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Январь 21, 2010, 14:20
Спасибо большое!!!Получилось..
А вот есть еще вопросик...у меня создается делегат для редактирования вещественных чисел...Можно ли как-нибудь мне его создать на frame

При переопределении метода createEditor делаю так:
Код
C++ (Qt)
QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &/*option*/,const QModelIndex &/*index*/) const{
      QFrame *fr=new QFrame(parent);
      QDoubleSpinBox *editor = new QDoubleSpinBox(fr);
      QGridLayout *gridLayout = new QGridLayout(fr);
      gridLayout->addWidget(editor, 0, 0, 1, 1);
      editor->setMinimum(m_min);
      editor->setMaximum(m_max);
      editor->setDecimals(m_precision);
      editor->setSingleStep(m_step);
editor->installEventFilter(const_cast<MyDSBDelegate*>(this));
    return editor;
    }
 
только так не получается..(( Это ообще возможно сделать??


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: crossly от Январь 21, 2010, 14:52
а если
Код:
return fr;


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Январь 21, 2010, 15:03
а если
Код:
return fr;

тогда системмная ошибка вылазиет...


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Январь 21, 2010, 15:15
А в первом случае только Frame рисуется


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: MoPDoBoPoT от Январь 21, 2010, 15:16
тогда системмная ошибка вылазиет...
Хм, какая?
Вообще, лучше фрейм и спинбокс агрегировать в один виджет, предоставив необходимый функционал. А то в методах setEditorData() и setModelData() надо будет копать до QDoubleSpinBox, что как-то не очень.


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: crossly от Январь 21, 2010, 15:18
тож верно...


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Январь 21, 2010, 16:48
Спасибо большое,получилось!!!
А QFrame я могу закрасить в серый цвет если он находится на белом фоне таблицы?? Или его цвет заисет только от виджета на котором он расположен??


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: lit-uriy от Январь 21, 2010, 17:37
Виджетам можно индивидуально устанавливать палитру.


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Январь 22, 2010, 14:40
А можно еще вопросик...
У меня установлен делегат на один из столбцов таблицы...какой-нить сигнал испускается об окончании редактирования?? Просто после редактирования ячейки обновляется запрос в моей модели и сбрасываются свойства таблицы,такие например как resizeRowsToContents и после первого изменения таблица принимает немного другой вид чем изначально


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Январь 22, 2010, 18:08
получается,что при вызове метода setQuery модели ширина строки становится стандартной


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Январь 22, 2010, 19:07
В классе делегатов есть такой сигнал commitData( QWidget * editor )
Только он у меня срабатывает только когда я выхожу из режима редактирования и при этом DoubleSpinBox при этом если не получает фокуса ввода


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Февраль 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);
  }
};
 


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Февраль 15, 2010, 15:41
Видимо все-таки дело в определенном мною виджете,унаследованном от QWidget..такой виджет вообще можно использовать в определении делегата??


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Февраль 15, 2010, 21:46
Получается,что в качестве редактора передается QWidget,на которм расположен фрейм и спинбокс и который,как я понимаю, не имеет фокуса ввода...как же сделать чтобы фокус ввода передавался бы спин боксу...


Название: Re: Как перейти в режим редактирования таблицы?
Отправлено: Chester от Февраль 16, 2010, 08:43
Вот блин,бьюсь уже над этим целый день...
Хочу чтобы у меня спинбокс был не на всю ячейку,как он по стандартному, а чтоб между ним и границами было какое-то расстояние...
Подскажите пожалуйста как все-таки это лучше организовать???Можт лучше вообще не создавать собственный виджет??