zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt之QTableView添加复选框(QAbstractItemDelegate)

Qt 添加 复选框 QTableView
2023-09-11 14:19:16 时间

上节分享了使用自定义模型QAbstractTableModel来实现复选框。下面我们来介绍另外一种方式:
自定义委托-QAbstractItemDelegate。


// 设置表格项数据 bool TableModel::setData(const QModelIndex index, const QVariant value, int role) if (!index.isValid()) return false; int nColumn = index.column(); FileRecord record = m_recordList.at(index.row()); switch (role) case Qt::DisplayRole: if (nColumn == File_PATH_COLUMN) record.strFilePath = value.toString(); m_recordList.replace(index.row(), record); emit dataChanged(index, index); return true; case Qt::CheckStateRole: case Qt::UserRole: if (nColumn == CHECK_BOX_COLUMN) record.bChecked = value.toBool(); m_recordList.replace(index.row(), record); emit dataChanged(index, index); return true; default: return false; return false; // 表格项数据 QVariant TableModel::data(const QModelIndex index, int role) const if (!index.isValid()) return QVariant(); int nRow = index.row(); int nColumn = index.column(); FileRecord record = m_recordList.at(nRow); switch (role) case Qt::TextColorRole: return QColor(Qt::white); case Qt::TextAlignmentRole: return QVariant(Qt::AlignLeft | Qt::AlignVCenter); case Qt::DisplayRole: if (nColumn == File_PATH_COLUMN) return record.strFilePath; return ""; case Qt::UserRole: if (nColumn == CHECK_BOX_COLUMN) return record.bChecked; default: return QVariant(); return QVariant(); // 表头数据 QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const switch (role) case Qt::TextAlignmentRole: return QVariant(Qt::AlignLeft | Qt::AlignVCenter); case Qt::DisplayRole: if (orientation == Qt::Horizontal) if (section == CHECK_BOX_COLUMN) return QStringLiteral("状态"); if (section == File_PATH_COLUMN) return QStringLiteral("文件路径"); default: return QVariant(); return QVariant(); // 表格可选中、可复选 Qt::ItemFlags TableModel::flags(const QModelIndex index) const if (!index.isValid()) return QAbstractItemModel::flags(index); Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable; return flags; }

data
用来显示数据,根据角色(颜色、文本、对齐方式、选中状态等)判断需要显示的内容。

setData
用来设置数据,根据角色(颜色、文本、对齐方式、选中状态等)判断需要设置的内容。

headerData
用来显示水平/垂直表头的数据。

flags
用来设置单元格的标志(可用、可选中、可复选等)。

QStyledItemDelegate
// 绘制复选框 void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem option, const QModelIndex index) const QStyleOptionViewItem viewOption(option); initStyleOption( viewOption, index); if (option.state.testFlag(QStyle::State_HasFocus)) viewOption.state = viewOption.state ^ QStyle::State_HasFocus; QStyledItemDelegate::paint(painter, viewOption, index); if (index.column() == CHECK_BOX_COLUMN) bool data = index.model()- data(index, Qt::UserRole).toBool(); QStyleOptionButton checkBoxStyle; checkBoxStyle.state = data ? QStyle::State_On : QStyle::State_Off; checkBoxStyle.state |= QStyle::State_Enabled; checkBoxStyle.iconSize = QSize(20, 20); checkBoxStyle.rect = option.rect; QCheckBox checkBox; QApplication::style()- drawPrimitive(QStyle::PE_IndicatorCheckBox, checkBoxStyle, painter, checkBox); // 响应鼠标事件,更新数据 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); }
QCheckBox::indicator:enabled:checked:hover { image: url(:/Images/checkBoxCheckedHover); QCheckBox::indicator:enabled:checked:pressed { image: url(:/Images/checkBoxCheckedPressed); QCheckBox::indicator:enabled:indeterminate { image: url(:/Images/checkBoxIndeterminate); QCheckBox::indicator:enabled:indeterminate:hover { image: url(:/Images/checkBoxIndeterminateHover); QCheckBox::indicator:enabled:indeterminate:pressed { image: url(:/Images/checkBoxIndeterminatePressed); }
QTableView *pTableView = new QTableView(this);

TableModel *pModel = new TableModel(this);

CheckBoxDelegate *pDelegate = new CheckBoxDelegate(this);

// 设置单行选中、最后一列拉伸、表头不高亮、无边框等

pTableView- setSelectionBehavior(QAbstractItemView::SelectRows);

pTableView- horizontalHeader()- setStretchLastSection(true);

pTableView- horizontalHeader()- setHighlightSections(false);

pTableView- verticalHeader()- setVisible(false);

pTableView- setShowGrid(false);

pTableView- setFrameShape(QFrame::NoFrame);

pTableView- setSelectionMode(QAbstractItemView::SingleSelection);

pTableView- setModel(pModel);

pTableView- setItemDelegate(pDelegate);

// 加载数据、更新界面

QList FileRecord recordList;

for (int i = 0; i 5; ++i)

 FileRecord record;

 record.bChecked = false;

 record.strFilePath = QString("E:/Qt/image_%1.png").arg(i + 1);

 recordList.append(record);

pModel- updateData(recordList);

QT QtableView操作详解 本文实现了使用QtableView控件来显示数据,数据源使用txt文本作为数据源,使用了QStandardItemModel作为数据模型来实现了对TableView空间的初始化,和对txt数据源的增删改查功能。
QT ComboBox控件 全面详解 本文详细的介绍了QComboBox控件的各种操作,例如:下拉框添加内容、默认显示、获取下拉框总行数、获取选中索引、获取当前内容、清除列表、重绘下拉框等操作。 本系列QT全面详解文章目前共有十五篇,本系列文章较为详细的讲述了QT控件的基础操作和使用,也谢谢大家的关注、点赞、收藏。