学习记录-QTableView自定义委托实现QCheckBox复选框
来源:互联网 发布:硕鼠mac youtube 编辑:程序博客网 时间:2024/06/01 13:02
之前就遇到表格里内嵌复选框的问题,网上查了好多资料也没有完全解决,今天花时间研究和实验后基本搞定。
使用的是自定义委托的方式,重写了panit函数和editorEvent函数实现指定列内嵌复选框,单击实现选中状态切换、选中状态下按空格键也可改变选中状态以及改变单元格大小时复选框始终在中间。
主要思路:paint函数里进行复选框的绘制,并实时读取模型数据显示状态,editorEvent函数里判断单元格点击情况进行处理。
源代码如下:
checkdelegate.h
#ifndef CHECKDELEGATE_H#define CHECKDELEGATE_H#include <QStyledItemDelegate>#include <QtGui>class CheckBoxDelegate : public QStyledItemDelegate{ Q_OBJECTpublic: CheckBoxDelegate(QObject *parent = 0);protected: void paint(QPainter* painter,const QStyleOptionViewItem& option,const QModelIndex& index) const; bool editorEvent(QEvent *event,QAbstractItemModel *model,const QStyleOptionViewItem &option,const QModelIndex &index);};#endif // CHECKDELEGATE_H
checkdelegate.cpp
#include "checkdelegate.h"#include <QMouseEvent>#include <QPainter>#include <QStyleOption>static QRect CheckBoxRect(const QStyleOptionViewItem &viewItemStyleOptions)/*const*/{ //绘制按钮所需要的参数 QStyleOptionButton checkBoxStyleOption; //按照给定的风格参数 返回元素子区域 QRect checkBoxRect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &checkBoxStyleOption); //返回QCheckBox坐标 QPoint checkBoxPoint(viewItemStyleOptions.rect.x() + viewItemStyleOptions.rect.width() / 2 - checkBoxRect.width() / 2, viewItemStyleOptions.rect.y() + viewItemStyleOptions.rect.height() / 2 - checkBoxRect.height() / 2); //返回QCheckBox几何形状 return QRect(checkBoxPoint, checkBoxRect.size());}CheckBoxDelegate::CheckBoxDelegate(QObject *parent): QStyledItemDelegate(parent){}void CheckBoxDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,const QModelIndex& index)const{ bool checked = index.model()->data(index, Qt::DisplayRole).toBool(); if(index.column() == 0){ qDebug() << checked; QStyleOptionButton checkBoxStyleOption; checkBoxStyleOption.state |= QStyle::State_Enabled; checkBoxStyleOption.state |= checked? QStyle::State_On : QStyle::State_Off; checkBoxStyleOption.rect = CheckBoxRect(option); QApplication::style()->drawControl(QStyle::CE_CheckBox,&checkBoxStyleOption,painter); }else{ QStyledItemDelegate::paint(painter, option, index); }}bool CheckBoxDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { if(index.column() == 0){ if((event->type() == QEvent::MouseButtonRelease) || (event->type() == QEvent::MouseButtonDblClick)){ QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); if(mouseEvent->button() != Qt::LeftButton || !CheckBoxRect(option).contains(mouseEvent->pos())){ return true; } if(event->type() == QEvent::MouseButtonDblClick){ return true; } }else if(event->type() == QEvent::KeyPress){ if(static_cast<QKeyEvent*>(event)->key() != Qt::Key_Space && static_cast<QKeyEvent*>(event)->key() != Qt::Key_Select){ return false; } }else{ return false; } bool checked = index.model()->data(index, Qt::DisplayRole).toBool(); return model->setData(index, !checked, Qt::EditRole); }else{ return QStyledItemDelegate::editorEvent(event, model, option, index); }}
#include <QtGui/QApplication>#include "checkdelegate.h"#include <QtGui>int main(int argc, char *argv[]){ QApplication a(argc, argv); QTableView tb; QStandardItemModel *md = new QStandardItemModel(/*&tb*/); md->setRowCount(5); md->setColumnCount(5); for(int i = 0;i<4;i++){ md->setData(md->index(1,i+1),QString("1"),Qt::EditRole); } CheckBoxDelegate *ck = new CheckBoxDelegate(/*&tb*/); tb.setModel(md); tb.setItemDelegate(ck); tb.show(); return a.exec();}
效果图:
0 0
- 学习记录-QTableView自定义委托实现QCheckBox复选框
- QTableView表头添加QCheckBox复选框
- QCheckBox 复选框
- QTableView实现行选和复选框
- QT5学习之复选框类QCheckBox的三态
- QT5学习之复选框类QCheckBox的三态
- QTableView添加复选框
- QTableView自定义模型和委托
- PyQt QTableView嵌入QCheckBox
- Qt在QTableView中使用自定义委托
- QCheckBox实现选择框变大
- QSqlTableModel和QTableView设置复选框
- QTableView中嵌入复选框CheckBox
- QTableView中嵌入复选框CheckBox
- QTableView中嵌入复选框CheckBox方法:实现QAbstractItemDelegate的paint()函数。
- QT:在QTableView中使用各种自定义委托
- QT:在QTableView中使用各种自定义委托
- Qt:在QTableView中使用各种自定义委托
- C语言中文件的读取
- [2016ICPC 青岛网络预选赛] HDU 5878 筛表
- Android温习之路Day1:java基础1
- 使用 Flask 设计 RESTful 的认证
- Real-Time Rendering-第三章 The Graphics Processing Unit(2)
- 学习记录-QTableView自定义委托实现QCheckBox复选框
- 安卓四大组件之Receiver
- 从这里开始记录学习
- android应用开发学习笔记-BroadcastReceiver
- JVM学习笔记(一)——Java内存模型
- sass安装与webstorm配置
- 蘑菇阵 使用路径数计算,想了好久没想出来,看答案才知道使用DP做的
- JVM学习笔记(二)——类加载机制
- 一个数组实现两个栈——栈和队列面试题(5)