【发布时间】:2013-09-30 16:45:53
【问题描述】:
我继承了here 中描述的 QAbstractTableModel。我已将 setData 编码为:
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if(role == Qt::EditRole)
{
Data[index.row()][index.column()]= value.toString();
qDebug()<<Data[index.row()][index.column()];//to check entered data passed or not
}
return true;
}
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
return Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsSelectable;
}
在主窗口中我连接了模型和视图:
connect(model,SIGNAL(dataChanged(QModelIndex,QModelIndex)),ui->tableView,SLOT(dataChanged(QModelIndex,QModelIndex)));
但编辑后数据不会在视图中更新。我尝试从 setData 函数发出 dataChanged 信号,但它不起作用。我在代码中遗漏了什么?
数据函数:
QVariant TableModel::data(const QModelIndex &index, int role) const
{
switch(role)
{
case Qt::DisplayRole:
if(index.column()==0)
{
return index.row()+1;
}
break;
case Qt::DecorationRole:
if(index.column()==1)
{
QColor c;
c.setRgb(0,200,200,200);
return c;
}
break;
case Qt::ToolTipRole:
if(index.column()==2)
{
return "colum 3";
}
break;
case Qt::StatusTipRole:
return "Not editable";
break;
case Qt::FontRole:
{
QFont f;
f.setFamily("Times");
f.setBold(true);
f.setKerning(true);
return f;
}
break;
case Qt::TextAlignmentRole:
{
return Qt::AlignCenter;
}
break;
case Qt::BackgroundRole:
if(index.column()==2)
{
QColor b;
b.setRgb(100,100,250,200);
return b;
}
break;
case Qt::ForegroundRole:
{
QColor b;
b.setRgb(0,100,250,200);
return b;
}
case Qt::CheckStateRole:
if(index.column()==3)
{
if(index.row()==1) return true;
return false;
}
break;
case Qt::InitialSortOrderRole:
return Qt::AscendingOrder;// use not clear
}
return QVariant();
}
【问题讨论】:
-
如果数据设置成功,您需要发出
dataChanged()信号,但在您的代码中您不需要。 -
请同时显示您的模型的 data() 函数。
-
好吧,您在
setData()函数中修改了数组Data[][],但您的data()函数甚至不使用相同的数组来显示其内容。为什么您希望您的视图会显示其他内容 - 它只是静态的。 -
真是个愚蠢的错误。我误解了 data 函数仅用于第一次显示仍然由 set data 和 datachange 信号处理。谢谢!
-
你不需要将dataChanged直接连接到任何视图槽!!!
标签: qt qt4 qtableview