Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QTimer



  • Hola, soy nuevo en esto, pero tengo una pregunta, tengo el timer listo y una alarma, el tema es que quiero realizar instrucciones usando el tiempo, es decir, pasan dos minutos y se hace esto luego pasan 10 minutos y se hace otra cosa. El tema es que activo el timer, llega a los dos minutos, hace lo que le pido y al instante vuelve para atras, es decir al comienzo, QUE PASA?'' Gracias por la respuesta...



  • @Casino said in QTimer:

    QUE PASA?

    Pasa lo que tiene que pasar...
    Cuando QTimer llega a cero empieza de nuevo. Pensalo como un reloj de arena: cuando termina lo das vuelta y empieza otra vez.

    Una opción para tu caso es que cuando termina timer1 y haces la tarea de timer1, arranques timer2. Cuando timer2 termina y haces las tareas de timer2 arranques timer1 y así se arma la rueda...



  • no hay manera de acomodar los dos timers, si alguien tiene algo del codigo se los agradezco.Gracias



  • @Casino intentaste con 2 objetos QTimer?
    podrías mostrar tu código hasta el momento?



  • @Pablo-J-Rogina
    void MainWindow::on_play_clicked()
    {

    int i = 0;
    int nivel = 1;
    
    QMediaPlayer *alarma = new QMediaPlayer;
    alarma->setMedia(QUrl::fromLocalFile("C:/Users/HP/Downloads/uno.mp3"));
    alarma->setVolume(30);
    
    
    ui->tabla2->hide();
    
    
    ui->seg->display(s);
    ui->min->display(m);
    ui->mtotal->display(mt);
    ui->htotal->display(ht);
    
    timer->start(1000);
    s++;
    s = s % 10;//hago de cuenta que el minuto dura 10 segundos, para ir mas rapido, si funciona lo pongo bien.
    if(s == 0){
        mt++;//minutos totales
        m++;//
    }
    ui->players->setText(QString::number(ui->tabla2->rowCount()));
    ui->level->setText(QString::number(nivel));
    ui->blindg->setText(ui->tabla2->item(i,0)->text()+"/"+ui->tabla2->item(i,1)->text());
    ui->blinds2->setText(ui->tabla2->item((i+1),0)->text()+"/"+ui->tabla2->item((i+1),1)->text());
    ui->anteg->setText(ui->tabla2->item(i,2)->text());
    ui->ante2->setText(ui->tabla2->item(i+1,2)->text());
    ui->blindtime->setText(ui->tabla2->item(i,3)->text());
    
    if(mt == ui->tabla2->item(0,3)->text().toInt()){
        //timer->stop();
        killTimer(3);
        alarma->play();
        m = 0;
        nivel++;
            ui->level->setText(QString::number(nivel));
            ui->blindg->setText(ui->tabla2->item(1,0)->text()+"/"+ui->tabla2->item(1,1)->text());
            ui->blinds2->setText(ui->tabla2->item(2,0)->text()+"/"+ui->tabla2->item(2,1)->text());
            ui->anteg->setText(ui->tabla2->item(2,2)->text());
            ui->ante2->setText(ui->tabla2->item(2,2)->text());
            ui->blindtime->setText(ui->tabla2->item(1,3)->text());
    
    }
    

    }
    mensaje de la aplicacion:
    QObject::killTimer(): Error: timer id 3 is not valid for object 0x8dfdf4 (MainWindow, MainWindow), timer has not been killed


  • Moderators

    Hola

    Ahí te está dando un error la función killTimer, por que no la usas bien, aquí tienes la documentación:

    https://doc.qt.io/qt-5/qobject.html#killTimer

    Tienes que pasarle un identificador que te haya devuelto la función startTime, no un int.

    La documentación de startTime:
    https://doc.qt.io/qt-5/qobject.html#startTimer

    ¿La llamada a timer->stop() que tienes comentada no te funciona? ¿No detiene el temporizador?

    La verdad que aun no entendí muy bien lo que quieres hacer, y no me queda claro viendo el código.

    Un saludo


  • Moderators

    Hola

    Después de contestar otra consulta me he dado cuenta de que quizás lo que te ocurre es que el QTimer se sigue ejecutando y contando el tiempo indefinidamente y tú lo que quieres es que únicamente haga una única cuenta, un único "disparo".

    Para eso tiene la propiedad singleShot.

    No sé si es lo que buscabas.

    Un saludo



  • No es mi caso pero me pareció interesante la posible solución pues tiene sentido el utilizar la propiedad singleShot.



  • ¿Podrías explicar de forma simple que quieres conseguir?


Log in to reply