У меня есть метод рисования в делегате, используемый в QTableview, где я добавляю индикатор флажка в ячейку. Когда я вхожу в ячейку, очень легко установить состояние наведения мыши на флажок, проверив option.state для флага QStyle :: State_MouseOver, но в идеале мне нужно только установить состояние наведения мыши для индикатора флажка, когда указатель мыши находится над самим индикатором, а не просто парить вокруг клетки. К сожалению, метод рисования в настоящее время срабатывает только при переходе от одной ячейки к другой, поэтому мне нужно несколько советов о том, как это сделать.
Код выглядит следующим образом (где mouse_pointer_ — последние сохраненные координаты мыши):
void
CheckBoxDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
// Draw our checkbox indicator
bool value = index.data(Qt::DisplayRole).toBool();
QStyleOptionButton checkbox_indicator;
// Set our button state to enabled
checkbox_indicator.state |= QStyle::State_Enabled;
checkbox_indicator.state |= (value) ? QStyle::State_On : QStyle::State_Off;
// Get our dimensions
checkbox_indicator.rect = QApplication::style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkbox_indicator, NULL );
// Position our indicator
const int x = option.rect.center().x() - checkbox_indicator.rect.width() / 2;
const int y = option.rect.center().y() - checkbox_indicator.rect.height() / 2;
checkbox_indicator.rect.moveTo(x, y);
if (checkbox_indicator.rect.contains(mouse_position_)) {
checkbox_indicator.state |= QStyle::State_MouseOver;
}
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkbox_indicator, painter);
}
Любая помощь приветствуется.
После некоторого исследования я обнаружил, что проблема заключалась в том, что мой метод editorEvent () должен был возвращать true (указывая, что содержимое ячейки изменилось), чтобы принудительно перекрасить ячейку и таким образом установить выбранное состояние. Код ниже:
bool CheckBoxDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index)
{
bool repaint_cell = false;
QMouseEvent *e = static_cast<QMouseEvent *> (event);
mouse_position_ = e->pos();
// We need to check if the mouse pointer is hovering within
// the checkbox indicator area of the table cell
QStyleOptionButton checkbox_indicator;
checkbox_indicator.rect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &checkbox_indicator, NULL );
const int x = option.rect.center().x() - checkbox_indicator.rect.width() / 2;
const int y = option.rect.center().y() - checkbox_indicator.rect.height() / 2;
checkbox_indicator.rect.moveTo(x, y );
if (checkbox_indicator.rect.contains(mouse_position_)) {
repaint_cell = true;
// Check if the user has clicked in this area
if (e->button() == Qt::LeftButton) {
switch(event->type()) {
case QEvent::MouseButtonRelease:
// Update model data in here
break;
default:
break;
}
}
}
return repaint_cell;
}
более простой
bool hover = option.state & QStyle::State_MouseOver;
if (hover) {
painter->fillRect(r, QColor(0,0,0,10));
}