【问题标题】:Editing data in QTableModel not changed after editingQTableModel中的编辑数据在编辑后没有改变
【发布时间】: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


【解决方案1】:

这里有一些笔记可以做。

  • 一旦数据正确更新,您应该发出dataChanged() 信号。

  • 您似乎没有在 data() 函数中使用名为“Data”的二维数组变量,该函数在 setData() 方法中正确设置。您需要在两个地方使用(相同的)变量。

  • 您不应将dataChanged() 信号连接到任何插槽。它会自动为您解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多