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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: виджет в делегате для QTableView  (Прочитано 13671 раз)
Karl-Philipp
Гость
« : Апрель 09, 2008, 00:09 »

Здравствуйте,

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

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

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

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

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


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

Уточните, пожалуйста, на правильном ли я пути?
Записан
ритт
Гость
« Ответ #1 : Апрель 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 )
/* второе на мой взгляд будет более изящным решением в твоём случае */
Записан
Karl-Philipp
Гость
« Ответ #2 : Апрель 09, 2008, 09:34 »

спасибо Вам большое, Константин, за уточнения Улыбающийся
Записан
Karl-Philipp
Гость
« Ответ #3 : Апрель 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++
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Апрель 09, 2008, 12:40 »

Ну собвственно говоря в ошибке и ответ:
Цитировать
use of undefined type 'QMetaProperty'

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Karl-Philipp
Гость
« Ответ #5 : Апрель 09, 2008, 12:44 »

Упс  Обеспокоенный, затупил, спасибо за помощь
Записан
Karl-Philipp
Гость
« Ответ #6 : Апрель 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, но никак не могу подставить это значение - компилятор ругается Непонимающий
« Последнее редактирование: Апрель 10, 2008, 12:58 от terlan » Записан
ритт
Гость
« Ответ #7 : Апрель 10, 2008, 13:09 »

я не вижу чтобы делегат вообще устанавливался

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

посмотри про делегаты в ассистанте, в примерах (например, тот же пикселятор)
пока что ты делаешь нечто странное
Записан
Karl-Philipp
Гость
« Ответ #8 : Апрель 10, 2008, 14:58 »

Да... намутил же я с созданием эдитора

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

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

Мое решение, думаю, выглядит коряво - придется каждый раз создавать новый виджет для того, чтобы положить его в новую ячейку. Может у кого есть другой вариант решения задачи Непонимающий
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Апрель 10, 2008, 19:44 »

непонял, то тебе надо или нет, но глянь сюда
Записан

Юра.
ритт
Гость
« Ответ #10 : Апрель 10, 2008, 20:06 »

вроде бы оно, но человек накодил то, что и так есть в кутэ.
Бардаг ©Dodge
Записан
Karl-Philipp
Гость
« Ответ #11 : Апрель 10, 2008, 20:26 »

вроде бы оно, но человек накодил то, что и так есть в кутэ.
Бардаг ©Dodge

не бардаГ, Улыбающийся
для меня, например, очень полезная инфа в плане переопределения методов.
lit-uriy , спасибо Вам большое.

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

Решение для себя выбрал как в предыдущем моем посте:
Мне обязательно нужен виджет в ячейке.
« Последнее редактирование: Апрель 10, 2008, 21:25 от terlan » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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