qtdemo Star Deletgate, Нонсенс |
Здравствуйте, гость ( Вход | Регистрация )
qtdemo Star Deletgate, Нонсенс |
ЙаМайскЫйПчОЛ |
24.5.2010, 13:32
Сообщение
#1
|
Участник Группа: Участник Сообщений: 154 Регистрация: 10.7.2008 Из: СПб Пользователь №: 232 Спасибо сказали: 7 раз(а) Репутация: 5 |
Товарищи, приветсвую Вас.
и Сразу к вопросу Если вы не поленитесь и откроете проект Star Delegate (демка) И закаментите в файле stardelegate.cpp строки 88 и 89 т.е. connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); перекомпилите и запустите, то наверное испытаете такой же шок, как и я... Программа все равно будет правильно работать... Более того, можете поиграться с этим сигналом и слотом, но в рамках данной программы они никогда не вызываються. И вот вопрос... какие механизмы обеспечивают правильное поведение Делегата и Редактора, и нахрена у товарищей из Qt написано что делегат работает через эту связку...??? Это не развлечения ради, а просто мой класс Редактора не работает так как должен, но об этом потом Сообщение отредактировал ЙаМайскЫйПчОЛ - 24.5.2010, 13:33 |
|
|
Litkevich Yuriy |
24.5.2010, 15:04
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
ЙаМайскЫйПчОЛ |
24.5.2010, 15:07
Сообщение
#3
|
Участник Группа: Участник Сообщений: 154 Регистрация: 10.7.2008 Из: СПб Пользователь №: 232 Спасибо сказали: 7 раз(а) Репутация: 5 |
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() не вызываеться ни одного раза в данном премере при этом это не сказываеться на работоспособности программы Сообщение отредактировал ЙаМайскЫйПчОЛ - 24.5.2010, 15:10 |
|
|
Litkevich Yuriy |
24.5.2010, 15:26
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
СЛОТ commitAndCloseEditor() там даже событие mouseReleaseEvent ни разу не возникает в виджете-редакторе.Вообще я как-то и думать забыл про эти сигналы у делегата: commitData closeEditor У меня и без них всё работает. Да и потом в примере Spin Box Delegate и без них всё работает собственно слот в представлении:
|
|
|
ЙаМайскЫйПчОЛ |
24.5.2010, 15:27
Сообщение
#5
|
Участник Группа: Участник Сообщений: 154 Регистрация: 10.7.2008 Из: СПб Пользователь №: 232 Спасибо сказали: 7 раз(а) Репутация: 5 |
Вооотттт....
Так когдаже вызываеться 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 Сообщение отредактировал ЙаМайскЫйПчОЛ - 24.5.2010, 15:33 |
|
|
Litkevich Yuriy |
24.5.2010, 15:30
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Цитата 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; Но мне SpinBox не подходит у меня свой виджет редактирования также как и StarEditor а какая разница? Всё одно, наследник QWidget
|
|
|
ЙаМайскЫйПчОЛ |
24.5.2010, 15:37
Сообщение
#7
|
Участник Группа: Участник Сообщений: 154 Регистрация: 10.7.2008 Из: СПб Пользователь №: 232 Спасибо сказали: 7 раз(а) Репутация: 5 |
Ну даже если это заработает, то дело принципа в том, почему не работает как в демке...
У них хитрость в том что у них работает только потому что изменение данных завязано на mouseMoveEvent, ни один другой mouseEvent не работает... т.е. работает, но срабатывает, только после фактического окончания редактирования НАВЕРНО придеться делать как в spinBox... Хотя врятли это решит проблемму... Я почему то думаю что мне нужен именно stardelegate example он похож на то что мне надо Может у меня пробелы в Qtобразовании и я чегото не допонимаю Сообщение отредактировал ЙаМайскЫйПчОЛ - 24.5.2010, 15:43 |
|
|
ЙаМайскЫйПчОЛ |
24.5.2010, 16:13
Сообщение
#8
|
Участник Группа: Участник Сообщений: 154 Регистрация: 10.7.2008 Из: СПб Пользователь №: 232 Спасибо сказали: 7 раз(а) Репутация: 5 |
РЕШЕНИЕ
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
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
эх, закладочки бы на форуме.
|
|
|
Текстовая версия | Сейчас: 30.12.2024, 21:23 |