Название: виджет в делегате для 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 т.е. если не утруждать себя перегрузкой createEditor, фабрика будет возвращать виджеты именно в таком соответствииdouble QDoubleSpinBox (|unsigned )int QSpinBox QDate QDateEdit QDateTime QDateTimeEdit QPixmap QLabel QString QLineEdit QTime QTimeEdit перегрузив, можно добиться возврата 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; однако, при компиляци выдает ошибку: Цитировать 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; взят из ассистанта? 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); Возможно проблема с 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 , спасибо Вам большое. Поспешил я с вопросом в теме. Не почитал внимательно про делегаты. Каюсь. Решение для себя выбрал как в предыдущем моем посте: Мне обязательно нужен виджет в ячейке. |