【问题标题】:QSqlTableModel, QTableView change columns not updatedQSqlTableModel、QTableView 更改列未更新
【发布时间】:2017-07-25 21:17:18
【问题描述】:

我有一个连接单个表的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();

}

【问题讨论】:

标签: qt


【解决方案1】:

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

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 中了解这些方法。

【讨论】:

  • 感谢您的回答,我已经阅读了有关这些信号的信息,但所有这些信号上都有以下注释: 注意:这是一个私人信号。它可以用于信号连接,但不能由用户发出。所以在我看来,这些命令是在您处理模型本身而不是基础数据时使用的
  • @Dan3460 抱歉我的错误,请查看我编辑的答案。
  • 我已经通过使用固定数量的列和控制列的隐藏和取消隐藏暂时解决了这个问题。我想解决这个问题,以便能够即时添加或删除列。问题是当我尝试使用这些函数时,程序无法编译,因为这是受保护的函数。
  • @Dan3460 你应该继承QSqlTableModel 并使用子类模型中的这些方法。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 2013-09-22
相关资源
最近更新 更多