Полная версия этой страницы:
qtdemo Star Deletgate
ЙаМайскЫйПчОЛ
24.5.2010, 13:32
Товарищи, приветсвую Вас.
и Сразу к вопросу
Если вы не поленитесь и откроете проект Star Delegate (демка)
И закаментите в файле stardelegate.cpp
строки 88 и 89
т.е. connect(editor, SIGNAL(editingFinished()),
this, SLOT(commitAndCloseEditor()));
перекомпилите и запустите, то наверное испытаете такой же шок, как и я...
Программа все равно будет правильно работать...
Более того, можете поиграться с этим сигналом и слотом, но в рамках данной программы они никогда не вызываються.
И вот вопрос... какие механизмы обеспечивают правильное поведение Делегата и Редактора,
и нахрена у товарищей из Qt написано что делегат работает через эту связку...???
Это не развлечения ради, а просто мой класс Редактора не работает так как должен, но об этом потом
Litkevich Yuriy
24.5.2010, 15:04
Цитата(ЙаМайскЫйПчОЛ @ 24.5.2010, 17:32)
работает через эту связку
через какую?
ЙаМайскЫйПчОЛ
24.5.2010, 15:07
http://doc.crossplatform.ru/qt/4.5.0/itemv...ardelegate.htmlIf 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() не вызываеться ни одного раза в данном премере при этом это не сказываеться на работоспособности программы
Litkevich Yuriy
24.5.2010, 15:26
Цитата(ЙаМайскЫйПчОЛ @ 24.5.2010, 19:07)
СЛОТ commitAndCloseEditor()
там даже событие mouseReleaseEvent ни разу не возникает в виджете-редакторе.
Вообще я как-то и думать забыл про эти сигналы у делегата:
commitData
closeEditor
У меня и без них всё работает. Да и потом в примере Spin Box Delegate и без них всё работает
собственно слот в представлении:
// 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);
}
...
ЙаМайскЫйПчОЛ
24.5.2010, 15:27
Вооотттт....
Так когдаже вызываеться 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
Litkevich Yuriy
24.5.2010, 15:30
Цитата
void QAbstractItemView::commitData(QWidget *editor)
...
if (!editor || !d->itemDelegate || d->currentlyCommittingEditor)
return;
QModelIndex index = d->indexForEditor(editor);
if (!index.isValid())
return;
d->currentlyCommittingEditor = editor;
QAbstractItemDelegate *delegate = d->delegateForIndex(index);
editor->removeEventFilter(delegate);
delegate->setModelData(editor, d->model, index);
editor->installEventFilter(delegate);
d->currentlyCommittingEditor = 0;
Цитата(ЙаМайскЫйПчОЛ @ 24.5.2010, 19:27)
Но мне SpinBox не подходит у меня свой виджет редактирования также как и StarEditor
а какая разница? Всё одно, наследник QWidget
ЙаМайскЫйПчОЛ
24.5.2010, 15:37
Ну даже если это заработает, то дело принципа в том, почему не работает как в демке...
У них хитрость в том что у них работает только потому что изменение данных завязано на mouseMoveEvent,
ни один другой mouseEvent не работает... т.е. работает, но срабатывает, только после фактического окончания редактирования
НАВЕРНО придеться делать как в spinBox...
Хотя врятли это решит проблемму...
Я почему то думаю что мне нужен именно stardelegate example он похож на то что мне надо
Может у меня пробелы в Qtобразовании и я чегото не допонимаю
ЙаМайскЫйПчОЛ
24.5.2010, 16:13
РЕШЕНИЕ
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);
и все будет тип-топ
Litkevich Yuriy
24.5.2010, 16:42
эх, закладочки бы на форуме.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.