2013-06-14 5 views
0

값이 ModelBinding이라는 클래스의 목록 (qlist) 인 해시 맵이 있습니다. 이 클래스에는 세 가지 속성이 있는데, 그 중 하나는 값입니다. Fro 내가 이해가 안되는 이유는, 내 코드가 객체를 복사하고 그 사본을 수정하는 것이고 대신 복사하지 않고 그 인스턴스를 수정하고 싶을 때입니다.Qt 반복자가 올바른 객체에 액세스하지 않습니다

질문

내가 객체를 역 참조하고 변경하고 나에게 보인다. 그러나 인스턴스 대신 복사본이 변경됩니다. 왜 그런가요? 대신 인스턴스를 어떻게 바꿀 수 있습니까?

void SqlQueryModel::exec() 
{ 
    /* Let's create a QSqlQuery. It will store the query and we'll bind values to it.*/ 
    QSqlQuery sQuery; 
    /* If we initialize the query with the string, then we CANNOT use bind (won't work and won't show any error).*/ 
    sQuery.prepare(this->query); 

    /** Now, let's go through all the models associated to this instance. 
    * For each of them, we'll bind its value. 
    **/ 

    QHash<QString, QList<ModelBinding> >::iterator bindingsIt; 
    for (bindingsIt = bindings.begin(); bindingsIt != bindings.end(); bindingsIt++){ 
     QList<ModelBinding>::iterator eachBindingIt; 
     QList<ModelBinding> curBinding = bindingsIt.value(); 

     for(eachBindingIt = curBinding.begin(); eachBindingIt != curBinding.end(); eachBindingIt++){ 
      ModelBinding binding = *eachBindingIt; 
      binding.bindToQuery(&sQuery); 
     } 
    } 

    /* Let's not forget to execute this query, or nothing will be displayed in the QML. */ 
    sQuery.exec(); 
    qDebug() << sQuery.lastQuery(); 
    QMapIterator<QString, QVariant> i(sQuery.boundValues()); 
    while (i.hasNext()) { 
     i.next(); 
     qDebug() << i.key().toAscii().data() << "=" 
       << i.value().toString().toAscii().data(); 
    } 
    this->setQuery(sQuery); 
} 
:

void SqlQueryModel::updateBindings(QString modelName, QString col, QVariant val) 
{ 
    qDebug() << "Got signal from model" << modelName << "col"<<col<<"changed to"<< val; 

    /** Now, let's go through all the models associated to this instance. 
    * We're going to see if the new signal we got is used for this model (for model name and column name). 
    * If so, we'll assigned it (cf. annotation A1). Then, we'll execute this query by calling exec(). 
    **/ 

    bool anyValueChanged = false; 

    QHash<QString, QList<ModelBinding> >::iterator bindingsIt; 
    for (bindingsIt = bindings.begin(); bindingsIt != bindings.end(); bindingsIt++){ 

     QList<ModelBinding>::iterator eachBindingIt; 
     QList<ModelBinding> curBinding = bindingsIt.value(); 

     for(eachBindingIt = curBinding.begin(); eachBindingIt != curBinding.end(); eachBindingIt++){ 
      ModelBinding binding = *eachBindingIt; 
      if(bindingsIt.key() == modelName && binding.column == col){ 
       binding.value = val; 
       binding.hasBeenChanged = true; 
       anyValueChanged = true; 
      } 
     } 
    } 
    if (anyValueChanged){ 
     this->exec(); 
    } 
} 

여기 anyValueChanged에 해당하는 경우 호출되는 간부 인 기능입니다 : 다음 코드

인스턴스의 값을 수정 (또는해야) 함수의

이전에 호출 된 bindToQuery라는 함수가 있습니다.

값이 명확하게 변경되지 않습니다 디버그 메시지에서
void ModelBinding::bindToQuery(QSqlQuery *sQuery) 
{ 
    sQuery->bindValue(placeholder, value); 
    qDebug() << "changed?" << hasBeenChanged; 
    if(sQuery->boundValue(placeholder) != value){ 
     qDebug() << "Binding error: " << sQuery->boundValue(placeholder) << "!=" 
       << value << "for" << placeholder; 
    }else{ 
     qDebug() << placeholder << "binding successful with value"<<value; 
    } 
} 

:

Got signal from model "tcModel" col "TLM_NO" changed to QVariant(QString, "AC00100") 
changed? true 
":tm" binding successful with value QVariant(QString, "AC01040") 
"SELECT * from tl04 WHERE TLM_NO=:tm" 
:tm = AC01040 
Generating role names. 
No error with query: 
"SELECT * from tl04 WHERE TLM_NO=?" 
+0

더 짧고 깨끗한 테스트 케이스를 가지고 놀았습니까? 그것은 당신을 도울 것이고 다른 사람들도 도와주기 쉽습니다. – tmpearce

답변

1
QList<ModelBinding> curBinding = bindingsIt.value(); 
... 
ModelBinding binding = *eachBindingIt; 

당신은 그것들을 편집하기 전에 객체의 복사본을 만들고있어. 사용 :

QList<ModelBinding>& curBinding = *bindingsIt; 
... 
ModelBinding& binding = *eachBindingIt; 
+0

대단히 고맙습니다! – ChrisR