我用自定义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();
}