一、前言
最近在弄Qt得模型视图编程,起源于手头的一个项目,需要做数据库方面的内容,决定用QTableView作为视图来显示。目前已经能够正常显示数据库中的数据,但是希望在QTableView的第一列显示一个QCheckBox,让用户选择是否显示这条记录,也即最后要实现的效果为:
在网上查了一些资料,主要是一些论坛的帖子,包括在CSDN也提问了,都说Qt不能实现直接在第一列显示一个QTableView,而是只能显示其他的内容,例如:Y或者N来代表是否选择该记录,当双击这个单元格的时候出现一个编辑代理,这个代理是QCheckBox,也就是下面这个效果:
双击后的效果:
(注:以上测试成功时使用的视图是QTableWidget而不是QTabeView,具体原因下面阐述)
二、问题现象
后来吧,我觉得既然选择了Qt这个工具,既然不能直接显示QCheckBox,那么我能实现上面那样的:显示“Y”或者“N”,双击后显示QCheckBox的效果也不错,当然也许自定义模型可以直接显示QCheckBox,这里我没有做。
然而当我将该代理直接用于QTableView的时候就出错了,现象如下:
1、当我不设置该代理的时候,QTableView可以直接显示数据库中的数据,如下图:
2、当我设置代理的时候,却连数据都不能显示了,效果如下图:
到这里我就无解了,个人觉得代理类的代码没问题,毕竟在QTableWidget中正常显示了啊!代理类代码如下:
#include "checkboxdelegate.h" #include <QCheckBox> checkboxDelegate::checkboxDelegate() { checkboxCol = 4; } checkboxDelegate::~checkboxDelegate() { } QWidget *checkboxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { if(index.isValid() && index.column() == checkboxCol) { QCheckBox *editor = new QCheckBox(parent); editor->installEventFilter(const_cast<checkboxDelegate*>(this)); return editor; } else { return QItemDelegate::createEditor(parent, option, index); } } void checkboxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { if(index.isValid() && index.column() == checkboxCol) { QString value = index.model()->data(index, Qt::DisplayRole).toString(); QCheckBox *checkBox = static_cast<QCheckBox*>(editor); if(value == "Y") checkBox->setCheckState(Qt::Checked); else checkBox->setCheckState(Qt::Unchecked); } else { QItemDelegate::setEditorData(editor, index); } } void checkboxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { if(index.isValid() && index.column() == checkboxCol) { QCheckBox *checkBox = static_cast<QCheckBox*>(editor); QString value; if(checkBox->checkState() == Qt::Checked) value = "Y"; else value = "N"; model->setData(index, value); } else { QItemDelegate::setModelData(editor, model, index); } } void checkboxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { if(index.isValid() && index.column() == checkboxCol) editor->setGeometry(option.rect); else QItemDelegate::updateEditorGeometry(editor, option, index); }三、结束语
希望有明白其中原因的,或者是知道解决方法的大神给我留言啊!谢谢!