Название: Свой делегат со своим виджетом (наследником 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 );
|