当前位置:软件学习 > 其它软件 >>

关于QTableView和QTableWidget设置代理的相关问题

一、前言
       最近在弄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); 
 

#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();

        QChec

补充:软件开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,