2017-07-25 69 views
0

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

} 
+0

请显示您的代码。 – eyllanesc

+0

这是一个非常大的计划。我可以根据需要制作样本 – Dan3460

+0

@ Dan3460,您需要编辑您的问题并添加一个[MCVE](https://stackoverflow.com/help/mcve)。 。 。 – Mike

回答

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中阅读这些方法。

+0

感谢您的回答,我已阅读有关这些信号,但他们都有这个注意他们:注意:这是一个私人信号。它可以用于信号连接,但不能由用户发射。因此,在我看来,这些命令是在您处理模型本身时使用的,而不是在下载的数据中使用 – Dan3460

+0

@ Dan3460对于我的错误感到抱歉,请查看我编辑的答案。 – Evgeny

+0

我已经通过使用固定数量的列和控制列的隐藏和取消隐藏来暂时解决了问题。我想解决这个问题,以便能够实时添加或删除列。问题是当我尝试使用这些函数时,程序不能编译,因为这是受保护的函数。 – Dan3460