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

原创 2012年03月30日 09:34:46

一、前言

       最近在弄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);

}
三、结束语

       希望有明白其中原因的,或者是知道解决方法的大神给我留言啊!谢谢!

QTableview常用几种代理总结

在项目中,我们经常使用到QTableview,由于业务需要,经常需要在QTableview中嵌入很多常用的控件,如:QSpinBox、QComboBox、QProcess、QDateTime、QPus...

QT:在QTableView中使用各种自定义委托

QT的MVC(View/Delegate)模型十分强大,可以利用各种控件来对表格的输入进行限制,不过我以前一直没有过,这几天研究了一下,写个小例子,希望大家喜欢。 如果看不懂这个例子,请先看QT...

QT:在QTableView中使用各种自定义委托

QT的MVC(View/Delegate)模型十分强大,可以利用各种控件来对表格的输入进行限制,不过我以前一直没有过,这几天研究了一下,写个小例子,希望大家喜欢。 如果看不懂这个例子,请先看QT...

Qtableview代理类实现添加Combobox 全部代码

我是把代理类单独放在一个头文件和APP中,我看网上有的代码是掺杂在其他类实现文件中,觉得这样不好 目前仅仅是实现了添加combobox,若实现其他的,可以在以下几个文件中再添加即可。 网上很多代码...

TableView 代理方法详细解释

-、建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)]; [Data...
  • saw471
  • saw471
  • 2016年02月22日 10:23
  • 3226

QTableWidget 实现自定义代理(delegate)

视图中单个条目的渲染和编辑是通过代理来进行的。 在大多数情况下,由视图所提供的缺省的代理已经足够。 如果我们希望更好地控制条目的渲染,简单地通过使用自定义模型,我们就能经常达到要求。 在我们重新实现的...

TableView 代理方法详细解释

-、建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)]; [Data...
  • saw471
  • saw471
  • 2016年02月22日 10:23
  • 3226

Qtableview代理类实现添加Combobox 全部代码

我是把代理类单独放在一个头文件和APP中,我看网上有的代码是掺杂在其他类实现文件中,觉得这样不好 目前仅仅是实现了添加combobox,若实现其他的,可以在以下几个文件中再添加即可。 网上很多代码...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于QTableView和QTableWidget设置代理的相关问题
举报原因:
原因补充:

(最多只允许输入30个字)