Qt делегат, устанавливающий состояние наведения мыши для флажка

У меня есть метод рисования в делегате, используемый в 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);
}

Любая помощь приветствуется.

1

Решение

После некоторого исследования я обнаружил, что проблема заключалась в том, что мой метод 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;
}
0

Другие решения

более простой

bool hover = option.state & QStyle::State_MouseOver;
if (hover) {
painter->fillRect(r, QColor(0,0,0,10));
}
0

По вопросам рекламы [email protected]