Signaler

[QT] QTimer qui s'exécute chaque 30secondes

Posez votre question Luune 24Messages postés mercredi 26 avril 2017Date d'inscription 25 juillet 2017 Dernière intervention - Dernière réponse le 27 juil. 2017 à 05:06 par loupius
Bonjour,

J'ai une fenêtre qui comporte 3 Frame, Je veux afficher un seul Frame chaque 30secondes ( le 1er, apres le 2eme et apres le 3eme ainsi de suite)
Pour le faire j'ai essayé ce code
#include "logista.h"
#include "ui_logista.h"

Logista::Logista(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Logista)
{

QTimer *timer2 = new QTimer(this);
connect(timer2, SIGNAL(timeout()), this, SLOT(ChangeFrame()));
timer2->start(30000);

ui->setupUi(this);
}

Logista::~Logista()
{
delete ui;
}

void Logista::ChangeFrame()
{

Frame1();
Frame2();
Frame3();

}
void Logista::Frame1()
{
ui->frame->show();
ui->frame_2->hide();
ui->frame_3->hide();
}
void Logista::Frame2()
{
ui->frame_2->show();
ui->frame->hide();
ui->frame_3->hide();
}
void Logista::Frame3()
{
ui->frame_3->show();
ui->frame->hide();
ui->frame_2->hide();
}



Avec ce code, les 3 Frames s'affichent et après 30 secondes, le Frame 3 s'affiche et rien ne se passe après

J’espère que j'ai bien expliqué mon problème, aidez moi a le résoudre s'il vous plait. Merci
Utile
+1
plus moins
Salut,
Je pense que ton problème tu devrais le poster sur :
http://codes-sources.commentcamarche.net
Cette réponse vous a-t-elle aidé ?  
Luune 24Messages postés mercredi 26 avril 2017Date d'inscription 25 juillet 2017 Dernière intervention - 7 juil. 2017 à 12:42
Ah je savais pas, merci beaucoup.
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonsoir,

L'affichage est logique; l'appel à 'ChangeFrame()' équivaut à:
  ui->frame->show();
ui->frame_2->hide();
ui->frame_3->hide();
ui->frame_2->show();
ui->frame->hide();
ui->frame_3->hide();
ui->frame_3->show();
ui->frame->hide();
ui->frame_2->hide();
Donc finalement seule 'frame_3 est montré.
Il vaut mieux écrire simplement quelque chose du genre:
static int flag;
void Logista::ChangeFrame()
{
ui->frame ->setVisible(flag == 0);
ui->frame_2->setVisible(flag == 1);
ui->frame_3->setVisible(flag == 2);
if (++flag >= 3)
flag = 0;
}
Bonne continuation.
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !