• 7128阅读
  • 2回复

自定义Model定时刷新数据中断问题(已加代码) [复制链接]

上一主题 下一主题
离线dxiaoj
 
只看楼主 正序阅读 楼主  发表于: 2011-07-15
我用自定义Model中的data()函数写数据,然后显示在TableView里面,其中也加入了QSortfilterproxymodel来排序和过滤。
在自定义Model中,我加入了一个刷新数据槽函数doUpdate():
void custeomModel::doUpdate()
{
    emit layoutChanged();
}
然后再Model初始化时,加入定时器刷新(1秒):
connect(timer , SIGNAL(timeout()), this, SLOT(doUpdate()))
编译通过后,点击Table表页就会报错中断,中断在QSortfilterproxymodel类的断言QASSERT(it.value())


不刷新不会报错。
用QStandardItemModel不会报错。
用自定义Model但不用QSortfilterproxymodel类时也不报错。


环境:QT 4.7.0 + VS2008
请教高人指点!


-----------------------------------------------------------------------------------------
我写了一个简单的程序来做测试,数据改成了写入随机数,部分代码如下:
//tableTest.cpp
tableTest::tableTest(QWidget *parent)
    :QTableView(parent)
{
    iniTab();
}


tableTest::~tableTest()
{}


void tableTest::iniTab()
{
    //初始化表头
    QStringList sList;
    sList << tr("姓名");
    sList << tr("语文");
    sList << tr("数学");
    sList << tr("英语");

    m_pModel     = new CTableModel(this, sList);
    m_pSFModel  = new QSortFilterProxyModel(this);
    m_pSFModel->setSourceModel(m_pModel);
    m_pSFModel->setDynamicSortFilter(true);
    setModel(m_pSFModel);
    setSortingEnabled(true);
}


//CTableModel.cpp
CTableModel::CTableModel(QObject *parent, const QStringList &strList)
    :QAbstractItemModel(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timerout()), this, SLOT(doUpdate));
    timer->start(1000);
}


CTableModel::~CTableModel()
{}


//设置行数(5行)
...
//设置列数
...
//设置表头
...


//子Index
QModelIndex CTableModel::index(int row, int column, const QModelIndex& parent) const
{
    return createIndex(row, column);
}
//父Index
QModelIndex CTableModel::parent(const QModelIndex& Index) const
{
    return QModelIndex();
}


QVariant CTableModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
    {
        return QVariant();
    }

    if(role == Qt::DisplayRole)
    {
        switch(index.column())
        {
        case 0::
            return GETRAND(0, 100);    //取0~100随机数
            break;
        case 1::
            return GETRAND(0, 100);    //取0~100随机数
            break;
        case 2::
            return GETRAND(0, 100);    //取0~100随机数
            break;
        case 3::
            return GETRAND(0, 100);    //取0~100随机数
            break;
        default:
            return QVariant();
        }
    }//endif

    return QVariant();

}


离线XChinux

只看该作者 2楼 发表于: 2011-07-15
上代码吧,否则别人只能猜测。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线zhengqiang
只看该作者 1楼 发表于: 2011-07-15
可能是数据缓存造成的。 你在刷新前后可能方法不对。建议查看一下帮助文档
快速回复
限100 字节
 
上一个 下一个