在 Qt 框架中,要在 QTableView
的表头中添加复选框,可以通过继承 QHeaderView
并重写 paintSection
方法来实现。
介绍一种继承 QHeaderView的方法实现QTableView
中添加复选框,可全选/全不选/部分选。
效果:
原理:
-
bool TableHeaderView::event(QEvent *event)
:- 这是一个重写的函数,用于处理鼠标事件。
- 当鼠标滑过或离开表头时,它会更新复选框的状态。
- 如果鼠标在复选框所在的列(
CHECK_BOX_COLUMN
)上滑过,它会设置m_bMoving
为真,并更新表头的显示。
-
CheckBoxDelegate
类:- 这是一个自定义的委托类,用于绘制表格中的复选框。
- 在
paint
函数中,它绘制了复选框的外观,根据数据模型中的值来确定复选框的状态。 - 在
editorEvent
函数中,它响应鼠标事件,根据用户点击来更新数据模型中的值。
部分关键代码:
bool TableHeaderView::event(QEvent *event)
{
updateSection(0);
if (event->type() == QEvent::Enter || event->type() == QEvent::Leave)
{
QMouseEvent *pEvent = static_cast<QMouseEvent *>(event);
int nColumn = logicalIndexAt(pEvent->x());
if (nColumn == CHECK_BOX_COLUMN)
{
m_bMoving = (event->type() == QEvent::Enter);
update();
return true;
}
}
return QHeaderView::event(event);
}
bool CheckBoxDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
QRect decorationRect = option.rect;
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if (event->type() == QEvent::MouseButtonPress && decorationRect.contains(mouseEvent->pos()))
{
if (index.column() == CHECK_BOX_COLUMN)
{
bool data = model->data(index, Qt::UserRole).toBool();
model->setData(index, !data, Qt::UserRole);
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}