QStyledItemDelegate - Как работает updateEditorGeometry?

Я использую Qt 4.7.

У меня есть модель, которую я отображаю в QTableView в двух столбцах, и моя цель - обеспечить встроенное редактирование этой модели в моем QTableView .

+-----------------+----------------+
|  Axis position  |  Axis range    |
+-----------------+----------------+
|      Left       | Fixed [0,1]    |
|      Left       | Source: SRC1   |
|      Right      | Source: SRC2   |
|      Left       | Fixed [5,10]   |
+-----------------+----------------+

Первый столбец можно редактировать с помощью простого QComboxBox для переключения между правым и левым, и он работает довольно хорошо. Проблема в моем втором столбце, который можно редактировать с помощью специального виджета.

Этот виджет довольно прост, он описывает диапазон. Итак, есть QComboBox для выбора типа диапазона («Фиксированный»: значения задаются пользователем, «Источник»: значение регулируется динамически от минимума / максимума источника).

Вот источник код моего настраиваемого виджета:

class RangeEditor : public QWidget
{
  Q_OBJECT

public:
  RangeEditor( ... );
  ~RangeEditor();

public:
  CurveView::ConfigAxes::Range range  () const;
  QVariant                     minimum() const;
  QVariant                     maximum() const;
  DataModel*                   model  () const;

  void range  ( CurveView::ConfigAxes::Range range );
  void minimum( QVariant minimum );
  void maximum( QVariant maximum );
  void model  ( DataModel* model );

public slots:
  void rangeTypeChanged( int type );

private: // --- External editors
  QComboBox* editRange_;
  QSpinBox*  editMinimum_;
  QSpinBox*  editMaximum_;
  QComboBox* editModel_;
};

RangeEditor::RangeEditor( ... ) : QWidget(parent)
{
  editRange_   = new QComboBox(this);
  editMinimum_ = new QSpinBox (this);
  editMaximum_ = new QSpinBox (this);
  editModel_   = new QComboBox(this);

  QHBoxLayout* layout = new QHBoxLayout();
  setLayout(layout);

  layout->addWidget( editRange_   );
  layout->addWidget( editMinimum_ );
  layout->addWidget( editMaximum_ );
  layout->addWidget( editModel_   );

  editRange_->addItem( "Fixed"  );
  editRange_->addItem( "Source" );

  editModel_->setCurrentIndex(0);    
  editModel_->hide();

  QObject::connect( editRange_, SIGNAL(currentIndexChanged(int)),
                    this,       SLOT  (rangeTypeChanged(int)) );
}

void RangeEditor::rangeTypeChanged( int type )
{
  if ( type==CurveView::ConfigAxes::FIXED )
  {
    editMinimum_->show();
    editMaximum_->show();
    editModel_->hide();
  }
  else if ( type==CurveView::ConfigAxes::SOURCE )
  {
    editMinimum_->hide();
    editMaximum_->hide();
    editModel_->show();
  }
}

Итак, теперь я создал QStyledItemDelegate, чтобы обеспечить представление настраиваемым редактором для моих столбцов. enter image description here

Я чувствую себя потерянным, так как не знаю, исходит ли проблема из моего пользовательского виджета (не предоставляющего достаточно информации для Qt, чтобы правильно вычислить его позицию) или из представления (возможно, некоторые поля, которые сократят размер редактора) или метод updateEditorGeometry () .

Любая помощь приветствуется, спасибо за чтение!

5
задан NewbiZ 28 March 2011 в 09:40
поделиться