Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Karl-Philipp от Апрель 09, 2008, 00:09



Название: виджет в делегате для QTableView
Отправлено: Karl-Philipp от Апрель 09, 2008, 00:09
Здравствуйте,

у меня есть задача:
есть таблица (QTableView), в основе которой находится QStandardItemModel.
в некторых ячейках таблицы должен находиться виджет, содержащий несколько текстовых строк. Для этого создаю объект QItemEditorFactory
Далее с помощью

Цитировать
QWidget * QItemEditorFactory::createEditor ( QVariant::Type type, QWidget * parent ) const  [virtual]

 создаю виджет (здесь не пойму, что передавать в качестве первого параметра).

Устанавливаю для делегата созданный эдиторфэктори

Цитировать
void QItemDelegate::setItemEditorFactory ( QItemEditorFactory * factory )]


После этого в нужных ячейках таблицы хочу разместить делегаты.

Уточните, пожалуйста, на правильном ли я пути?


Название: Re: виджет в делегате для QTableView
Отправлено: ритт от Апрель 09, 2008, 02:35
уточняю: на правильном :)

Цитировать
QWidget * QItemEditorFactory::createEditor ( QVariant::Type type, QWidget * parent ) const  [virtual]

 создаю виджет (здесь не пойму, что передавать в качестве первого параметра).

даже при поверхностном ознакомлении с доками по QItemEditorFactory будет понятно, что первый параметр определяет какой именно виджет нужно вернуть...и даже приведена табличка соответствия некоторых типов виджетам
Цитировать
bool               QComboBox
double            QDoubleSpinBox
(|unsigned )int QSpinBox
QDate            QDateEdit       
QDateTime      QDateTimeEdit
QPixmap          QLabel
QString           QLineEdit
QTime             QTimeEdit
т.е. если не утруждать себя перегрузкой createEditor, фабрика будет возвращать виджеты именно в таком соответствии
перегрузив, можно добиться возврата QTimeEdit для типа QPixmap или MySuperPuperWidget для типа UserType + 1
а можно и вообще не перегружать фабрику, а просто воспользоваться методом registerEditor ( QVariant::Type type, QItemEditorCreatorBase * creator )
/* второе на мой взгляд будет более изящным решением в твоём случае */


Название: Re: виджет в делегате для QTableView
Отправлено: Karl-Philipp от Апрель 09, 2008, 09:34
спасибо Вам большое, Константин, за уточнения :)


Название: Re: виджет в делегате для QTableView
Отправлено: Karl-Philipp от Апрель 09, 2008, 12:35
вот, что получилось:

Код:
	QItemDelegate *delegate = new QItemDelegate;
QItemEditorFactory *editorFactory = new QItemEditorFactory;
QItemEditorCreatorBase *creator = new QStandardItemEditorCreator<WidgetClassName>();
editorFactory->registerEditor(QVariant::UserType, creator);
delegate->setItemEditorFactory(editorFactory);

однако, при компиляци выдает ошибку:


Цитировать
d:\Qt\include\QtGui\../../src\gui\itemviews\qitemeditorfactory.h(62) : error C2027: use of undefined type 'QMetaProperty'
        d:\Qt\include\QtCore\../../src\corelib\kernel\qobjectdefs.h(165) : see declaration of 'QMetaProperty'
        d:\Qt\include\QtGui\../../src\gui\itemviews\qitemeditorfactory.h(62) : while compiling class-template member function 'QStandardItemEditorCreator<T>::QStandardItemEditorCreator(void)'
        with
        [
            T=WidgetClassName
        ]
        DialogActions.cpp(29) : see reference to class template instantiation 'QStandardItemEditorCreator<T>' being compiled
        with
        [
            T=WidgetClassName
        ]
d:\Qt\include\QtGui\../../src\gui\itemviews\qitemeditorfactory.h(62) : error C2228: left of '.name' must have class/struct/union type
NMAKE : fatal error U1077: 'cl' : return code '0x2'
Stop.

почему же так получается, ведь пример
Код:
 QItemEditorFactory *editorFactory = new QItemEditorFactory;
 QItemEditorCreatorBase *creator = new QStandardItemEditorCreator<MyFancyDateTimeEdit>();
 editorFactory->registerEditor(QVariant::DateType, creator);

взят из ассистанта?

Qt 4.2.3, компилятор VC++


Название: Re: виджет в делегате для QTableView
Отправлено: pastor от Апрель 09, 2008, 12:40
Ну собвственно говоря в ошибке и ответ:
Цитировать
use of undefined type 'QMetaProperty'

Заюзайте инклуд
Цитировать
#include <QMetaProperty>


Название: Re: виджет в делегате для QTableView
Отправлено: Karl-Philipp от Апрель 09, 2008, 12:44
Упс  :-[, затупил, спасибо за помощь


Название: Re: виджет в делегате для QTableView
Отправлено: Karl-Philipp от Апрель 09, 2008, 13:56
Что-то делегат не появляется в ячейке, устанавливаю его в айтем (0;0) ???

сделал так:

Код:
QStandardItemModel* model = new QStandardItemModel(1,5);

MyWidget *widget = new MyWidget;
QItemDelegate *itemDelegate = new QItemDelegate;
QItemEditorFactory *editorFactory = new QItemEditorFactory;
QItemEditorCreatorBase *creator = new QStandardItemEditorCreator<MyWidget>();
editorFactory->registerEditor(QVariant::UserType, creator);
itemDelegate->setItemEditorFactory(editorFactory);

QModelIndex index = model->index(0, 0, QModelIndex());
itemDelegate->setEditorData(widget, model, index );

QTableView *table = new QTableView;
table->setModel(model);

Возможно проблема с UserType, Константин предлагал использовать UserType + 1, но никак не могу подставить это значение - компилятор ругается ???


Название: Re: виджет в делегате для QTableView
Отправлено: ритт от Апрель 10, 2008, 13:09
я не вижу чтобы делегат вообще устанавливался

из того, что ты написал, получается, что ты пытаешься создать редактор в определённой ячейке
из первого поста было понятно, что тебе надо показать кастомный виджет (не редактор) в определённых ячейках
конкретизируй задачу

посмотри про делегаты в ассистанте, в примерах (например, тот же пикселятор)
пока что ты делаешь нечто странное


Название: Re: виджет в делегате для QTableView
Отправлено: Karl-Philipp от Апрель 10, 2008, 14:58
Да... намутил же я с созданием эдитора

конкретизирую задачу:
в некоторые ячейки таблицы требуется помесить виджет (например, с лайнэдитами и чекбоксами) таким образом, чтобы можно было доставать эти значения от туда.

Сделал так:
с помощью
Цитировать
void QAbstractItemView::setIndexWidget ( const QModelIndex & index, QWidget * widget )
помещаю виджет в нужную ячейку.
Для доступа к элементам виджета использую указатель на виджет.

Мое решение, думаю, выглядит коряво - придется каждый раз создавать новый виджет для того, чтобы положить его в новую ячейку. Может у кого есть другой вариант решения задачи ???


Название: Re: виджет в делегате для QTableView
Отправлено: lit-uriy от Апрель 10, 2008, 19:44
непонял, то тебе надо или нет, но глянь сюда (http://www.forum.crossplatform.ru/index.php?showtopic=535&view=findpost&p=2991)


Название: Re: виджет в делегате для QTableView
Отправлено: ритт от Апрель 10, 2008, 20:06
вроде бы оно, но человек накодил то, что и так есть в кутэ.
Бардаг ©Dodge


Название: Re: виджет в делегате для QTableView
Отправлено: Karl-Philipp от Апрель 10, 2008, 20:26
вроде бы оно, но человек накодил то, что и так есть в кутэ.
Бардаг ©Dodge

не бардаГ, :)
для меня, например, очень полезная инфа в плане переопределения методов.
lit-uriy , спасибо Вам большое.

Поспешил я с вопросом в теме. Не почитал внимательно про делегаты. Каюсь.

Решение для себя выбрал как в предыдущем моем посте:
Мне обязательно нужен виджет в ячейке.