У меня возникают проблемы с пониманием, как использовать QTimer
, так что я бы повторить определенное действие (нажатия кнопки или сетевого запроса).Как использовать QTimer повторить определенное действие
После answer из этого славного question, я не могу понять, как подключить QTimer::Timeout
сигнал таймера на MainWIndow::request
сигнала точно так же, как у меня есть кнопка подключенного в данный момент. Проблема в том, что я не могу повторить это; он компилируется и запускается без ошибок, но без повтора.
(Как человек, который отвечал на вопрос, я тоже могу иметь повторение таймера, если я ставлю все мой код в main.cpp
, но я хотел бы увидеть, как именно это можно сделать в этом случае.)
Ниже приведен упрощенный код взят из этого примера, чтобы указать мои попытки:
#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 //
}
обновление
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
Как можно видеть в разделе комментариев, я также попытался в заменить частный слот для кнопки с onTimeout и в mainwindow.cpp
перед подключением я создал объект QTimer и запустил его, и сразу после этого я использовал этот объект для определения connect(&timer,&QTimer::timeout,this,&MainWindow::onTimeout);
. Кроме того, я заменил определение слота кнопки в конце кодом, связанным с onTimeout.
Если вы можете объяснить, что мне не хватает, или даже предоставить код для точного примера, как показано here, что было бы замечательно для меня.
Вы создаете таймер как локальный в конструкторе, то есть таймер уничтожается после возвращения конструктора. Либо распределите его динамически 'QTimer * timer = new QTimer' или лучше - сделайте таймер членом класса. – dtech
Я очень сомневаюсь, что вы хотите, чтобы таймер нажимал кнопки или что-то в этом роде. Вы хотите, чтобы таймер вызывал все действия, связанные с нажатием кнопки. Это совсем другое дело. –