Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: qtdemo Star Deletgate
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
ЙаМайскЫйПчОЛ
Товарищи, приветсвую Вас.
и Сразу к вопросу
Если вы не поленитесь и откроете проект Star Delegate (демка)
И закаментите в файле stardelegate.cpp
строки 88 и 89
т.е. connect(editor, SIGNAL(editingFinished()),
this, SLOT(commitAndCloseEditor()));
перекомпилите и запустите, то наверное испытаете такой же шок, как и я...
Программа все равно будет правильно работать...
Более того, можете поиграться с этим сигналом и слотом, но в рамках данной программы они никогда не вызываються.
И вот вопрос... какие механизмы обеспечивают правильное поведение Делегата и Редактора,
и нахрена у товарищей из Qt написано что делегат работает через эту связку...???

Это не развлечения ради, а просто мой класс Редактора не работает так как должен, но об этом потом
Litkevich Yuriy
Цитата(ЙаМайскЫйПчОЛ @ 24.5.2010, 17:32) *
работает через эту связку
через какую?
ЙаМайскЫйПчОЛ
http://doc.crossplatform.ru/qt/4.5.0/itemv...ardelegate.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() не вызываеться ни одного раза в данном премере при этом это не сказываеться на работоспособности программы
Litkevich Yuriy
Цитата(ЙаМайскЫйПчОЛ @ 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);
    }
...
ЙаМайскЫйПчОЛ
Вооотттт....
Так когдаже вызываеться 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
Цитата
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
ЙаМайскЫйПчОЛ
Ну даже если это заработает, то дело принципа в том, почему не работает как в демке...
У них хитрость в том что у них работает только потому что изменение данных завязано на 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);
и все будет тип-топ
Litkevich Yuriy
эх, закладочки бы на форуме.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.