J'ai du mal à comprendre comment utiliser le QTimer
pour que je répétition une action spécifique (clic d'un bouton ou une demande réseau).Comment utiliser un QTimer pour répéter une action spécifique
Après la answer de cette belle question, je ne peux pas comprendre comment connecter le signal QTimer::Timeout
de la minuterie au signal MainWIndow::request
de la même manière que je le bouton actuellement connecté. Le problème est que je ne peux pas le faire répéter; il compile et fonctionne sans erreur mais sans répétition.
(comme la personne qui a posté la question, moi aussi peut avoir la répétition de minuterie si je mets tout mon code dans le main.cpp
mais je voudrais voir exactement comment il peut être fait dans ce cas.)
Ci-dessous est un code simplifié tiré de cet exemple pour montrer mes tentatives:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QKeyEvent>
#include <QApplication>
#include <QtWidgets>
#include <QTimer>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// GUI setup here //
networkManager = new QNetworkAccessManager;
connect(networkManager, &QNetworkAccessManager::finished, this, &MainWindow::on_NetworkManagerFinished);
connect(ui->getButton, &QPushButton::clicked, this, &MainWindow::on_getButton_clicked);
// Connect the timer to repeat the GET request
QTimer timer;
// [1st attempt]
connect(&timer, SIGNAL(&QTimer::timeout), this, SLOT(&MainWindow::on_TimerTimeout));
// [2nd attempt]
connect(&timer, SIGNAL(timeout()), this, SLOT(timer_buttonClicked()));
timer.start(1500); // 1.5 secs
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_NetworkManagerFinished(QNetworkReply *reply)
{
// Parse and display JSON here //
}
// Make GET request when button is clicked
void MainWindow::on_getButton_clicked() //on_TimerTimeout()
{
// Make GET request
QUrlQuery query;
QUrl url("http://blah/blahblah");
query.addQueryItem("blah", "blah");
url.setQuery(query);
QNetworkRequest networkRequest(url);
networkManager->get(networkRequest);
ui->getButton->setEnabled(false);
// Restart timer
timer->start(1500); // 1.5 secs
// Do stuff in the GUI here //
}
mise à jour
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_NetworkManagerFinished(QNetworkReply* reply);
void on_getButton_clicked();
private:
Ui::MainWindow *ui;
QNetworkAccessManager *networkManager;
};
#endif // MAINWINDOW_H
Comme il peut être vu dans la section des commentaires, j'ai également essayé dans mainwindow.h
pour remplacer l'emplacement privé pour le bouton avec un onTimeout et dans le mainwindow.cpp
avant la connexion, j'ai créé un objet QTimer et l'ai démarré et juste après que j'ai utilisé cet objet pour définir le connect(&timer,&QTimer::timeout,this,&MainWindow::onTimeout);
. De plus, j'ai remplacé la définition de l'emplacement du bouton à la fin par le code associé à onTimeout.
Si vous pouvez expliquer ce que je manque ou même fournir le code pour l'exemple exact comme vu here ce serait génial pour moi de comprendre.
Vous créez le temporisateur en tant que local dans le constructeur, ce qui signifie que le temporisateur est détruit après le retour du constructeur. Allouez-le dynamiquement 'QTimer * timer = new QTimer' ou mieux - faites du minuteur un membre de la classe. – dtech
Je doute beaucoup que vous voulez que le minuteur clique sur les boutons ou quoi que ce soit du genre. Vous voulez que la minuterie appelle n'importe quelle action connectée au clic du bouton. C'est assez différent. –