2015-10-07 204 views
1

我有Qt Creator中为QTableView中QT setItem导致“程序没有响应”

添加值到表在下面我的代码中的问题,我已经从数据库中插入数据的表的功能。

QSqlQuery q; 
//counts the number of rows that contain the value acicn 
q.prepare("select count(*) from checkdata where acic_num=:acicn"); 
q.bindValue(":acicn", acicn); 
q.exec(); 

int rowtablecount = 0; 
if(q.next()){ 
    rowtablecount = q.value(0).toInt(); 
    //using value acicn, inserts into the table the number of rows found in database 
    QAbstractItemModel *mdl; 
    mdl = ui->editEntry_tbl->model(); 
     mdl->insertRows(0,rowtablecount); 
}else{ 
    qDebug() << "table error in edit entry"; 
} 
q.finish(); 

QSqlQuery q2; 
q2.prepare("select *from acic where acic_num=:acicnum"); 
q2.bindValue(":acicnum", acicn); 
q2.exec(); 
//above extracts data from database table acic, below from table checkdata 

q.prepare("select * from checkdata where acic_num=:acicnum"); 
q.bindValue(":acicnum", acicn); 
q.exec(); 

QStandardItemModel *model; 
QString temp; 
while(q.next()){ 
    for(int r=0; r<rowtablecount-1; r++){ 
     temp =q.value(6).toString(); //date paid 
     QStandardItem *cellFiller8 = new QStandardItem(temp); 
     model->setItem(r,10,cellFiller8); //<<--- PART WHERE PROGRAM FAILS AND HANGS, SHOWING PROGRAM NOT RESPONDING 

     temp =q.value(5).toString(); //amount of check 
     QStandardItem *cellFiller6 = new QStandardItem(temp); 
     model->setItem(r,7,cellFiller6); 

     temp =q.value(4).toString(); //account code 
     QStandardItem *cellFiller5 = new QStandardItem(temp); 
     model->setItem(r,6,cellFiller5); 

     temp =q.value(3).toString(); //particulars 
     QStandardItem *cellFiller4 = new QStandardItem(temp); 
     model->setItem(r,5,cellFiller4); 

     temp =q.value(2).toString(); //payee name 
     QStandardItem *cellFiller3 = new QStandardItem(temp); 
     model->setItem(r,4,cellFiller3); 

     temp =q.value(1).toString(); //alobs 
     QStandardItem *cellFiller2 = new QStandardItem(temp); 
     qDebug() << temp; 
     model->setItem(r,3,cellFiller2); 

     temp =q.value(0).toString(); //check number 
     QStandardItem *cellFiller1 = new QStandardItem(temp); 
     qDebug() << temp; 
     model->setItem(r,2,cellFiller1); 
    } 
} 
while(q2.next()){ 
    for(int r=0; r<rowtablecount-1; r++){ 
     temp =q2.value(3).toString(); //amount of acic 
     QStandardItem *cellFiller7 = new QStandardItem(temp); 
     model->setItem(r,8,cellFiller7); 

     temp =q2.value(0).toString(); //check date 
     QStandardItem *cellFiller = new QStandardItem(temp); 
     qDebug() << "before setitem" << temp; 
     model->setItem(r,1,cellFiller); 
     qDebug() << "after setItem"; 

    } 
} 

基本上,使用model->setItem(r,1,cellFiller)会导致程序挂起。我发现这非常令人困惑,因为我在多次偶尔填写QTableView时使用了同样的方法,但这是第一次发生这种情况。

任何想法为什么发生这种情况?

回答

2

您忘记初始化您的QStandardItemModel *model变量。

+0

我现在看到问题了。我对'QStandardItemModel * model'的初始化位于代码的不同部分,与上面的函数分开。我应该看到初始化错误,它取消了那个。它已被修复。谢谢 – excogitare

+0

@excogitare有一个很好的规则 - 总是初始化所有变量/成员。并使用智能指针。空指针异常的检测速度比未初始化的变量快得多。 –