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
用来设置单元格的标志(可用、可选中、可复选等)。
// 绘制复选框 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控件的基础操作和使用,也谢谢大家的关注、点赞、收藏。
相关文章
- Qt之QHeaderView自定义排序(终极版)
- Qt之QHeaderView添加复选框
- Qt之QTableView添加复选框(QAbstractItemDelegate)
- Qt之QTableView添加复选框(QAbstractTableModel)
- Qt-qt creator 运行 出现 "can not open .... jom for write 解决方案
- QT-在Qt Widgets Application中怎么显示printf的输出内容?
- QT-QT button以及label实现不规则图形(五种方法:使用QSS,设置Mask图片,自己画)
- Qt音视频开发37-识别鼠标按下像素坐标
- Qt编写可视化大屏电子看板系统3-新建布局
- 各种GUIBuilder体验TouchGFX,AppWizard,GUIX Studio,Embedded Wizard,AWTK,柿饼UI,LVGL,Qt fot MCU等(2021-12-21)
- paip.提升用户体验---c++ qt 悬浮窗实现
- Qt 控制Widget窗体大小方法
- Qt QMutex使用详解
- Qt 关于QT_BEGIN_NAMESPACE宏的作用
- Qt QList详解
- Qt的容器类
- Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例
- 【Qt】在ubuntu上为可执行程序qt创建图标(亲测)
- 2、QT基础——创建Qt项目
- Qt之QTableWidget 表头添加QComBox
- QT应用编程: 程序发布添加版权、版本信息
- Qt的打印机Demo
- Qt QPushButton与QToolButton的区别
- Qt工作笔记-跑马灯效果
- Qt中使用vlc-qt处理音视频
- Qt 在Qwidget里添加控件
- Qt笔记-当前时间转GMT并转换成英文(Qt构造http头中Date数据)
- QT设置QToolBar带有图标和文字
- qt交叉编译报错::-1: error: The Qt version is invalid: Qt version is not properly installed,please run make
- 【Qt】加载.h文件显示窗体并添加交互逻辑
- QT打印窗口、退出、设置字体及颜色、设置时间、控件实现系统函数、添加资源文件(菜单图片)、工具栏添加图片
- QT学习---------6之信号和槽的拓展
- Qt编写可视化大屏电子看板系统27-模块5负荷分布
- Qt编写可视化大屏电子看板系统2-配色方案
- Qt编写控件属性设计器4-加载属性