crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в qtdemo Star Deletgate
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 24.5.2010, 16:42
  эх, закладочки бы на форуме.
ЙаМайскЫйПчОЛ Дата 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);
и все будет тип-топ
ЙаМайскЫйПчОЛ Дата 24.5.2010, 15:37
  Ну даже если это заработает, то дело принципа в том, почему не работает как в демке...
У них хитрость в том что у них работает только потому что изменение данных завязано на mouseMoveEvent,
ни один другой mouseEvent не работает... т.е. работает, но срабатывает, только после фактического окончания редактирования


НАВЕРНО придеться делать как в spinBox...

Хотя врятли это решит проблемму...
Я почему то думаю что мне нужен именно stardelegate example он похож на то что мне надо
Может у меня пробелы в Qtобразовании и я чегото не допонимаю
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: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: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:07
  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, 15:04
 
Цитата(ЙаМайскЫйПчОЛ @ 24.5.2010, 17:32) *
работает через эту связку
через какую?
ЙаМайскЫйПчОЛ Дата 24.5.2010, 13:32
  Товарищи, приветсвую Вас.
и Сразу к вопросу
Если вы не поленитесь и откроете проект Star Delegate (демка)
И закаментите в файле stardelegate.cpp
строки 88 и 89
т.е. connect(editor, SIGNAL(editingFinished()),
this, SLOT(commitAndCloseEditor()));
перекомпилите и запустите, то наверное испытаете такой же шок, как и я...
Программа все равно будет правильно работать...
Более того, можете поиграться с этим сигналом и слотом, но в рамках данной программы они никогда не вызываються.
И вот вопрос... какие механизмы обеспечивают правильное поведение Делегата и Редактора,
и нахрена у товарищей из Qt написано что делегат работает через эту связку...???

Это не развлечения ради, а просто мой класс Редактора не работает так как должен, но об этом потом
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 4.7.2025, 23:40