Russian Qt Forum

Qt => Model-View (MV) => Тема начата: alexman от Октябрь 19, 2010, 12:29



Название: Свой делегат со своим виджетом (наследником QWidget).
Отправлено: alexman от Октябрь 19, 2010, 12:29
1. Есть делегат Delegate.
2. Есть виджет Widget - наследник QWidget. Delegate работает с Widget.

Почему при редактировании ничего не происходит? Если же Delegate будет использовать QSpinBox напрямую, то все работает!?

Вот компилируемый код:
Цитировать
#include <QtCore/QDebug>
#include <QtGui/QApplication>
#include <QtGui/QItemDelegate>
#include <QtGui/QLayout>
#include <QtGui/QSpinBox>
#include <QtGui/QTreeWidgetItem>

class Widget : public QWidget
{
public:
   Widget( QWidget* parent ) : QWidget( parent )
   {
      _box = new QSpinBox( this );
      _box->setRange( 0, 100 );

      QHBoxLayout* layout = new QHBoxLayout;
      layout->addWidget( _box );

      setLayout( layout );
   }

   QSize sizeHint() const
   {
      return QSize( 100, 100 );
   }

   void setValue( const int value )
   {
      _box->setValue( value );
   }

   int value() const
   {
      return _box->value();
   }

private:
   QSpinBox* _box;
};

class Delegate : public QItemDelegate
{
public:
   Delegate( QObject* parent = 0 ) : QItemDelegate( parent ) {}
   ~Delegate() {}

   QWidget* createEditor( QWidget* parent, const QStyleOptionViewItem&, const QModelIndex& ) const
   {
      Widget* widget = new Widget( parent );
      return widget;
   }

   void setEditorData( QWidget* editor, const QModelIndex& ) const
   {
      ( (Widget*)editor )->setValue( 1 );
   }

   void updateEditorGeometry( QWidget* editor,   const QStyleOptionViewItem& option, const QModelIndex& ) const
   {
      editor->setGeometry( option.rect );
   }
};

int main( int argc, char** argv )
{
   QApplication app( argc, argv );

   QTreeWidget widget;
   widget.setColumnCount( 1 );

   widget.setItemDelegate( new Delegate( &widget ) );

   QTreeWidgetItem* item = new QTreeWidgetItem( &widget );
   item->setText( 0, "asdfaga" );
   item->setFlags( item->flags() | Qt::ItemIsEditable );

   app.setActiveWindow( &widget );
   widget.show();

   return app.exec();
}


Название: Re: Свой делегат со своим виджетом (наследником QWidget).
Отправлено: asvil от Октябрь 19, 2010, 12:51
А что бы Вы хотели чтобы произошло?
Давайте начнем с первого: при реализации делегата Вы должны переопределить createEditor, setEditorData, setModelData. В данном примере это не выполнено.



Название: Re: Свой делегат со своим виджетом (наследником QWidget).
Отправлено: alexman от Октябрь 19, 2010, 13:28
Я хочу, чтобы при двойном клике на элемент появился виджет, но этого не происходит!

createEditor, setEditorData переопределены! А setModelData вызывается только когда данные в виджете отредактированы (то есть должен сначала появиться виджет, отредактировали в нем данные, Enter). Меня интересует почему при двойном клике не появляется виджет?


Название: Re: Свой делегат со своим виджетом (наследником QWidget).
Отправлено: alexman от Октябрь 19, 2010, 14:00
100000 извинений))) Проблема решена: когда формирую лайоут забыл установить margin: layout->setMargin( 0 );