LINUX.ORG.RU

Qt и кнопки на item'ах


0

1

Дано: есть собственная вьюха, модель и делагат, все это отлично работает. Задача: необходимо чтобы при наведении мыши на item в нем же появлялось пара кнопок(например удалить и редактировать), когда мышь покидает item - кнопы исчезают.(Нечто подобное реализовано в QtCreator в списке открытых документов)

Ответ на: комментарий от gleb_zhulik

Делегат наследуется от QStyledItemDelegate есть оверайт метод createEditor в котором создаешь свой видгет с кнопками. Через оверайт setEditorData устанавливаешь данные. Через оверайт setModelData устанавливаешь данные в модель. :) Методы вызываются самим делегатом.

createEditor() returns the widget used to change data from the model and can be reimplemented to customize editing behavior.
setEditorData() provides the widget with data to manipulate.
updateEditorGeometry() ensures that the editor is displayed correctly with respect to the item view.
setModelData() returns updated data to the model.

Грубо твой делегат будет таким:

class MyDelegate: public QStyledItemDelegate
{
QWidget * MyDelegate::createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
}

void MyDelegate::setEditorData ( QWidget * editor, const QModelIndex & index ) const
{
}

void MyDelegate::setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const
{
}

}

zJes ★★
()
Ответ на: комментарий от zJes

Ну а еветФильтром просто следишь на мышь, над каким итемом она находится и активируешь редактор(к примеру, openPersistentEditor или edit), это как вариант. Есть и еще решения, к примеру через паинт и QWidget::render и реальной активацией редактора только при клике(форвард сообщений). Последний метод работает быстрее.

zJes ★★
()
Ответ на: комментарий от zJes

Мне не нужен редактор, делегат в моем случае занимается только показом данных и все, вариант с render интерсен. Виджет на делегате рисуется, но как обработать клик по нему?

gleb_zhulik
() автор топика
Ответ на: комментарий от gleb_zhulik

Ну видгет с кнопками это и есть редактор. :)

У вью, mousePressEvent, или eventFilter, как удобнее будет использовать. А по координатам клика возьмешь индекс через itemAt. (Дальше можешь через индекс взять видгет(редактор), смаповать координаты в систему того видгета, и следовательно через childAt можешь определить какой контрол был «кликнут»)

Правда все просто? :)

*Зла на некоторые вещи в куте не хватает*

zJes ★★
()
Ответ на: комментарий от gleb_zhulik

Виджет рисуется в paintEvent через QStyle::drawControl, клики мыши будут пригодить в editorEvent() делегата. Туда же будут приходить MouseMove event'ы (если WA_MouseTracking у таблицы включен), где, по QModelIndex можно вести состояние: в какой ячейке и что рисовать в paintEvent(). И, наверное, нужно дополнительно обработать leaveEvent(), чтобы стереть кнопки если мышь покинет таблицу...

summatus
()
Ответ на: комментарий от summatus

editorEvent - придет когда итем уже в режиме редактирования, то есть активирован(то есть, грубо, на кнопку надо будет нажимать 2 раза). ТС вроде бы так не хотел... :)

zJes ★★
()
Ответ на: комментарий от zJes

Mouse events are sent to editorEvent() even if they don't start editing of the item. This can, for instance, be useful if you wish to open a context menu when the right mouse button is pressed on an item.

summatus
()
Ответ на: комментарий от summatus

Ок. :)

Тогда это что то странное, у меня это не работало, пока эдитор не был активирован.

zJes ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.