QSqlTableModel,QTableView更改列未更新
问题描述:
我有一个连接到单个表的SQL模型,该表将根据特定条件在执行程序期间更改列数。该模型连接到一个QTableView。 我有一个函数,控制函数结束时的列数,我有一个调用model-> select(),更新模型和tableView-> reset()的信息,我认为会重新排列该视图添加或删除列。 问题是,视图不会从原来的列数改变。如果我减少数字,我可以看到数据更改并在缺少的列上显示为空。有没有一个命令为tableView自己调整大小? 编辑问题 在班里我读表的构造方法并将其设置为视图:QSqlTableModel,QTableView更改列未更新
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();
}
答
我相信你忘了一些保护方法:
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中阅读这些方法。
请显示您的代码。 – eyllanesc
这是一个非常大的计划。我可以根据需要制作样本 – Dan3460
@ Dan3460,您需要编辑您的问题并添加一个[MCVE](https://*.com/help/mcve)。 。 。 – Mike