QSqlTableModel,QTableView更改列未更新

时间:2017-07-25 21:17:18

标签: qt

我有一个连接到单个表的SQL模型,该表将根据执行程序期间的某些条件更改列数。该模型连接到QTableView。 我有一个函数控制函数末尾的列数我调用model-> select(),更新模型的信息和tableView-> reset(),我认为会重新排列视图添加或删除列。 问题是视图不会从它拥有的原始列数更改。如果我减少数量,我可以看到数据更改并在缺少的列上显示为空。是否有一个命令让tableView自行调整大小? 编辑问题 在类的构造函数中,我正在读表并将其设置为视图:

  header = new QSqlTableModel(parent,data->m_db);
  header->setTable("C"+QString::number(markTime.toSecsSinceEpoch())+"T");
  header->select();
  ui->heading->setModel(header);
  ui->heading->show();

每次更改列数是一个更改列数的SQL过程:

void ImportProcess::copyTable(QString oldTable, QString newTable)
{
  QSqlQuery queryOld, queryNew;
  queryOld.prepare("select * from :oldTable");
  queryOld.bindValue(":oldTable",oldTable);
  queryOld.exec();

  if(queryOld.record().isEmpty()==true) return; //Old table was empty, nothing to copy

  int oldColumn=queryOld.record().count();

  QString replaceLine="insert into "+newTable+" values(";
  while(queryOld.next()==true)
    {
      replaceLine.append(QString::number(queryOld.value(0).toInt()));
      replaceLine.append(", "+queryOld.value(1).toString());
      for(int y=0;y<(oldColumn < ui->columns->value() ? oldColumn : ui->columns->value());y++)
        {
          replaceLine.append(", "+QString::number(queryOld.value(y+2).toFloat()));
        }
      replaceLine.append(")");
      queryNew.exec(replaceLine);
    }
}

然后更新头文件,这里我认为将重绘tableview:

void ImportProcess::updateHeadingTable()
{
  QSqlQuery query;
  query.exec("delete from C"+QString::number(markTime.toSecsSinceEpoch())+"T");
  QString description= ui->Week->isChecked() == true ? "Week" : "Size";
  query.exec("insert into C"+QString::number(markTime.toSecsSinceEpoch())+"T (id, description) values (101, '"+description+"')");
  for(int x=0;x<ui->columns->value();x++)
    {
      query.exec("update C"+QString::number(markTime.toSecsSinceEpoch())+"T set col"+QString::number(x)+" = '30'");
    }
  header->select();
  ui->heading->reset();

}

1 个答案:

答案 0 :(得分:0)

我相信你忘记了一些受保护的方法:

void QAbstractItemModel::beginInsertColumns(const QModelIndex &parent, int first, int last);
void QAbstractItemModel::beginRemoveColumns(const QModelIndex &parent, int first, int last);
void QAbstractItemModel::endInsertColumns();
void QAbstractItemModel::endRemoveColumns();

每次要更改的列数应该调用第一种或第二种方法。更改后,您应该调用第三或第四方法。

您可以在Qt documentation中了解这些方法。