Problema com o 'for'



  • Bom dia, Estou desenvolvendo uma aplicação e estou com o seguinte problema.
    Fiz um for para verificar dado a dado de uma tableview, nesta verificação ele faz uma consulta para ver se o dado que está sendo verificado existe em um banco de dados local, após essa verificação o programa pode seguir por dois caminhos(caso o dado exista ou não).
    Nestes em cada um destes caminhos eu tenho a chamado de um método tipo void.

    Este é um resumo do meu programa, o problema é que ele só faz a chamado do método quando chega no ultimo índice da tableview, independente de quantos dados eu tenha guardados nela, ele só chama o método no ultimo deles.
    Não sei se estou usando o 'for' de maneira errada, preciso de uma orientação.

    Resumo da implementação:
    for(i = 0; i < ui->tbvwAnswered->model()->rowCount(); i++)
    {
    exam.setNumExam(ui->tbvwAnswered->model()->data(ui->tbvwAnswered->model()->index(i, 2)).toInt());
    .
    .
    .
    if(db->checkExamExists(QString(exam.getNumExam()).toInt()))
    {
    wload->downloadReport(exam);
    }
    else
    {
    wload->downloadAllReportsLoading(ui->tbvwAnswered->model()->data(ui->tbvwAnswered->model()->index(i, 0)).toInt(), t);

            }
        }


  • Mas ele faz chamada de qual método uma vez só? downloadReport ou downloadAllReportsLoading?
    Se você está num loop, o rowCount() é maior que 1? Se sim, algo realmente está estranho, pois no código do seu post existem 2 caminhos (if/else).



  • @TioRoy
    Ele verifica se o dado do rowcount existe no banco de dados local e se existir chama o downloadReport, se não existir chama o downloadAllReportsLoading.
    A idéia era percorrer cada dado do rowcount e dar um caminha para cada um deles, ou if/ else.
    Quando o rowcount tem apenas 1 dado ele funciona normalmente, quando tem mais de um ele só da um caminho para o ultimo dado.

    O exemplo de implementação que eu coloquei está só parte do código, uma versão simplificada para ajudar na visualização



  • @Ticianelli

    Você diz que quando o rowCount é > 1 o loop só roda 1 vez?

    Que tipo é o seu model()?

    O que acontece se você escrever um código assim, só para testar:

    for(i = 0; i < ui->tbvwAnswered->model()->rowCount(); i++)
    {
    qDebug() << i;
    }
    

    Ele funciona corretamente?



  • @TioRoy
    Quando eu mencionei "Quando o rowcount tem apenas 1 dado ele funciona normalmente, quando tem mais de um ele só da um caminho para o ultimo dado.", eu me referia ao problema em questão, este é o problema, ele percorre os dados do rowcount, mas ele não chama os métodos para cada dado percorrido.
    Coloquei prints em todas as linhas quase, e o caminho que o software está fazendo é o seguinte: Entra no for do rowcount pelo indice 0; Puxa os dados do rowcount; Verifica se o exame existe; Entra no if/else de acordo com se ele existe ou não (até aqui funciona certo), mas quando ele entra no if/else ele não faz a chamada do método que está dentro dele.



  • @Ticianelli
    Nem no IF e nem no ELSE? Tá muito estranho isso.

    downloadReport e downloadAllReportsLoading são funções que fazem algum trabalho assíncrono? Pelo nome devem fazer download, e se você usa algo +- como no código abaixo, o seu problema pode estar nestas funções, já que são assíncronas.

    Sem olhar mais código fica um pouco difícil ajudar.

    void test() 
    {
       QNetworkAccessManager *manager = new QNetworkAccessManager(this);
       connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(replyFinished(QNetworkReply*)));
    
       manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
    }
    

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.