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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Свой делегат со своим виджетом (наследником QWidget).  (Прочитано 4840 раз)
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();
}
Записан
asvil
Гость
« Ответ #1 : Октябрь 19, 2010, 12:51 »

А что бы Вы хотели чтобы произошло?
Давайте начнем с первого: при реализации делегата Вы должны переопределить createEditor, setEditorData, setModelData. В данном примере это не выполнено.

Записан
alexman
Гость
« Ответ #2 : Октябрь 19, 2010, 13:28 »

Я хочу, чтобы при двойном клике на элемент появился виджет, но этого не происходит!

createEditor, setEditorData переопределены! А setModelData вызывается только когда данные в виджете отредактированы (то есть должен сначала появиться виджет, отредактировали в нем данные, Enter). Меня интересует почему при двойном клике не появляется виджет?
Записан
alexman
Гость
« Ответ #3 : Октябрь 19, 2010, 14:00 »

100000 извинений))) Проблема решена: когда формирую лайоут забыл установить margin: layout->setMargin( 0 );
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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