Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ как вставить делегат в QTableView

Автор: Litkevich Yuriy 31.3.2008, 9:32

имеется табличное представление нужно для определенного столбца установить в качестве виджета-редактора QDateTimeEdit,
у представления есть метод setItemDelegateForColumn( int column, QAbstractItemDelegate * delegate )
как превратить QDateTimeEdit в QAbstractItemDelegate
чё-то я не доганяю :(

почитал про QItemEditorFactory но все равно туплю.

Автор: ViGOur 31.3.2008, 9:39

Вот пример: http://crossplatform.ru/documentation/qtdoc4.3/model-view-delegate.php#a-simple-delegate, правда с QSpinBox, но думаю достаточно понятно.

Автор: Litkevich Yuriy 31.3.2008, 9:43

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

QAbstractItemDelegate * fooDelegateFactory(Qwidget*)

Автор: ViGOur 31.3.2008, 9:50

Тада не знаю не пробовал... :)

Автор: Litkevich Yuriy 8.4.2008, 7:07

в общем соорудил я несколько делегатов в одном классе.
А именно:
QSpinBox
QComboBox, оперирующий 2 значениями ,"1" и "0" -- т.е. Булевый
QDateTimeEdit
Эксплуатировать так:

YStdDelegate delegate(YStdDelegate::TQSpinBox);
YStdDelegate booldelegate(YStdDelegate::TBool);   // Для QComboBox
YStdDelegate datedelegate(YStdDelegate::TQDateTimeEdit);


Вдруг кому пригодится, выкладываю тестовый проект с моим творением
 ystddelegate.zip ( 8.88 килобайт ) : 729

там и файл для DoxyGen'а

Автор: Litkevich Yuriy 8.4.2008, 7:08

В догонку HTML-документация, которую нагенерил DoxyGen
 ystddelegate_doc.zip ( 93.18 килобайт ) : 542

Автор: rich 8.4.2008, 20:47

если в Qt 4.1.4 для QTableWidget есть только

setItemDelegate ( QAbstractItemDelegate * )

можно ли вставить делегат только для определенного столбца? :unsure:

Автор: Litkevich Yuriy 8.4.2008, 21:14

думаю что по простому ни как :(

Автор: icore2008 10.4.2008, 20:24

Юрий, спасибо Вам большое за проект.
попробовал правда его откомпилировать с помощью VC++, что-то не пошлО, заругался компилятор:


Цитата
cl -c -nologo -Zm200 -Zi -MDd -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -D
ystddelegate.cpp
ystddelegate.cpp(60) : error C2360: initialization of 'cmbox' is skipped by 'case' label
ystddelegate.cpp(56) : see declaration of 'cmbox'
ystddelegate.cpp(63) : error C2361: initialization of 'cmbox' is skipped by 'default' label
ystddelegate.cpp(56) : see declaration of 'cmbox'
ystddelegate.cpp(90) : error C2360: initialization of 'cmbox' is skipped by 'case' label
ystddelegate.cpp(80) : see declaration of 'cmbox'
ystddelegate.cpp(95) : error C2361: initialization of 'dtedit' is skipped by 'default' label
ystddelegate.cpp(91) : see declaration of 'dtedit'
ystddelegate.cpp(95) : error C2361: initialization of 'cmbox' is skipped by 'default' label
ystddelegate.cpp(80) : see declaration of 'cmbox'
ystddelegate.cpp(117) : error C2360: initialization of 'cmbox' is skipped by 'case' label
ystddelegate.cpp(114) : see declaration of 'cmbox'
ystddelegate.cpp(121) : error C2361: initialization of 'dtedit' is skipped by 'default' label
ystddelegate.cpp(118) : see declaration of 'dtedit'
ystddelegate.cpp(121) : error C2361: initialization of 'cmbox' is skipped by 'default' label
ystddelegate.cpp(114) : see declaration of 'cmbox'
NMAKE : fatal error U1077: 'cl' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio .NET\VC7\BIN\nmake.exe"' :
Stop.

Автор: Litkevich Yuriy 10.4.2008, 20:36

честно говоря, время позднее и голова тормозит, может операторы при case в скобки взять:

switch(typeeditor)
{
    case TBool:
    {
        QComboBox *cmbox = new QComboBox(parent);
        cmbox->addItem("0");
        cmbox->addItem("1");
        return static_cast<QWidget *>(cmbox);
    }
    case TQDateTimeEdit:
    {
        editor = static_cast<QDateTimeEdit *>(new QDateTimeEdit(parent));
        break;
    }
    default:
        editor = static_cast<QSpinBox *>(new QSpinBox(parent));
}

Автор: icore2008 10.4.2008, 21:30

Цитата(Litkevich Yuriy @ 10.4.2008, 20:36) *
честно говоря, время позднее и голова тормозит, может операторы при case в скобки взять:
...


скомпилилолсь, спасибо.
Вопрос, конечно не по теме, но все же:
Скажите, пожалуйста, а gcc код без скобочек компилировал без проблем?
Почему VC++ не проглотил без скобок?

Автор: Litkevich Yuriy 11.4.2008, 5:06

может это связано с ключами компиляции, типа "строго по такому-то стандарту",
вообще я их обычно пишу, но мне говорили что это не обязательно, вот я, в первый раз, решил не писать :)

Автор: icore2008 11.4.2008, 8:38

Цитата(Litkevich Yuriy @ 11.4.2008, 5:06) *
может это связано с ключами компиляции, типа "строго по такому-то стандарту",
вообще я их обычно пишу, но мне говорили что это не обязательно, вот я, в первый раз, решил не писать :)

Ветка мягко начала тянуться не в ту сторону :)
Я вот тоже, открыл справочник Г. Шилдта:
Цитата
switch (expression)
{
...
}

Цитата
значением выражения должно быть целое число или символ
В данном примере - целое число :-/
вроде бы все корректно.

Автор: Admin 11.4.2008, 8:50

Цитата(icore2008 @ 11.4.2008, 9:38) *
Ветка мягко начала тянуться не в ту сторону :)
Угу, если будете намерены дальше обсуждать, то скажите, чтобы я тему раздел. ;)

Автор: Litkevich Yuriy 11.4.2008, 10:59

вообще мне интересно в чем проблема, поэтому создел тему http://www.forum.crossplatform.ru/index.php?showtopic=570

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)