Товарищи, приветсвую Вас.
и Сразу к вопросу
Если вы не поленитесь и откроете проект Star Delegate (демка)
И закаментите в файле stardelegate.cpp
строки 88 и 89
т.е. connect(editor, SIGNAL(editingFinished()),
this, SLOT(commitAndCloseEditor()));
перекомпилите и запустите, то наверное испытаете такой же шок, как и я...
Программа все равно будет правильно работать...
Более того, можете поиграться с этим сигналом и слотом, но в рамках данной программы они никогда не вызываються.
И вот вопрос... какие механизмы обеспечивают правильное поведение Делегата и Редактора,
и нахрена у товарищей из Qt написано что делегат работает через эту связку...???
Это не развлечения ради, а просто мой класс Редактора не работает так как должен, но об этом потом
http://doc.crossplatform.ru/qt/4.5.0/itemviews-stardelegate.html
If the item is a StarRating, we create a StarEditor and connect its editingFinished() signal to our commitAndCloseEditor() slot, so we can update the model when the editor closes.
Я со всей ответственностью заявляю что СЛОТ commitAndCloseEditor() не вызываеться ни одного раза в данном премере при этом это не сказываеться на работоспособности программы
// Close the editor
if (editor) {
bool isPersistent = d->persistent.contains(editor);
bool hadFocus = editor->hasFocus();
QModelIndex index = d->indexForEditor(editor);
if (!index.isValid())
return; // the editor was not registered
if (!isPersistent) {
setState(NoState);
QModelIndex index = d->indexForEditor(editor);
editor->removeEventFilter(d->delegateForIndex(index));
d->removeEditor(editor);
}
if (hadFocus)
setFocus(); // this will send a focusLost event to the editor
else
d->checkPersistentEditorFocus();
QPointer<QWidget> ed = editor;
QApplication::sendPostedEvents(editor, 0);
editor = ed;
if (!isPersistent && editor)
d->releaseEditor(editor);
}
...
Вооотттт....
Так когдаже вызываеться commit???
И зачем описаны mouseReleaseEvent
У меня складываеться ощущение что они сами не знают зачем написали этот код
Но мне SpinBox не подходит у меня свой виджет редактирования также как и StarEditor
Я переопределил bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
для делегата и в теле
qDebug() << event;
return QStyledItemDelegate::editorEvent(event, model, option, index);
+
StarDelegate(QWidget *parent = 0) : QStyledItemDelegate(parent)
{
connect(this, SIGNAL(commitData(QWidget *)), this, SLOT(commitMe(QWidget*)));
}
+
private slots:
void commitMe(QWidget *w){ qDebug() << "commit"; }
на выходе оказалось что
............
QMouseEvent(MouseButtonRelease, 1, 0, 0)
commit
Ну даже если это заработает, то дело принципа в том, почему не работает как в демке...
У них хитрость в том что у них работает только потому что изменение данных завязано на mouseMoveEvent,
ни один другой mouseEvent не работает... т.е. работает, но срабатывает, только после фактического окончания редактирования
НАВЕРНО придеться делать как в spinBox...
Хотя врятли это решит проблемму...
Я почему то думаю что мне нужен именно stardelegate example он похож на то что мне надо
Может у меня пробелы в Qtобразовании и я чегото не допонимаю
РЕШЕНИЕ
QWidget * QAbstractItemDelegate::createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const [virtual]
И вот оно
The returned editor widget should have Qt::StrongFocus; otherwise, QMouseEvents received by the widget will propagate to the view.
т.е. конструктору надо сделать setFocusPolicy(Qt::StrongFocus);
и все будет тип-топ
эх, закладочки бы на форуме.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)