2017-07-25 19 views
0

私は1つのテーブルに接続する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); 
    } 
} 

そして、ヘッダファイルが更新され、ここで私はテーブルビューが再描画されることが考えどこです:

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(); 

程度の列の数はあなたが第一又は第二のメソッドを呼び出す必要が変更されるたびに。変更後、3番目または4番目のメソッドを呼び出す必要があります。

これらの方法についてはQt documentationで読むことができます。

+0

答えをいただきありがとうございます。私はこれらの信号について読んでいますが、それらにはすべてこのノートがあります。注:これは私信です。信号接続で使用することはできますが、ユーザーが放出することはできません。だから、それらのコマンドは、モデル自体で作業しているときに使われているようです。 – Dan3460

+0

@ Dan3460私の間違いのために申し訳ありません、私の編集された答えを見てください。 – Evgeny

+0

固定数の列を使用し、列の非表示と非表示を制御することで、問題を一時的に解決しました。私はこれを解決して、オンザフライで列を追加したり削除したりしたいと考えています。問題は、これらの関数を使用しようとすると、プログラムがコンパイルされないのは、これが保護された関数であるためです。 – Dan3460

関連する問題