2
을 반복하는 QTimer를 사용하는 방법이 그래서 것 반복 특정 작업 (버튼 또는 네트워크 요청의 클릭).나는 <code>QTimer</code>을 사용하는 방법을 이해하는 데 문제가 특정 작업
이 좋은 question에서 answer에 따라, 나는 현재 연결된 버튼이 같은 MainWIndow::request
신호에 같은 방식으로 타이머의 QTimer::Timeout
신호를 연결하는 방법을 알아낼 수 없습니다. 문제는 내가 그것을 반복 할 수 없다는 것이다. 그것은 컴파일과 오류없이 반복없이 실행됩니다.
(필자는 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
주석 섹션에서 볼 수 있듯이, mainwindow.h
에서 버튼의 개인 슬롯을 onTimeout으로 바꾸고, mainwindow.cpp
에서 QTimer 객체를 만들고 연결 한 직후에 그 객체를 사용했습니다. connect(&timer,&QTimer::timeout,this,&MainWindow::onTimeout);
을 정의하십시오. 또한, 끝에있는 단추 슬롯 정의를 onTimeout 관련 코드로 대체했습니다.
제가 누락 된 내용을 설명하거나 정확한 예제 코드를 제공하면 here으로 이해할 수 있습니다.
생성자에서 로컬로 타이머를 만들면 타이머가 생성자가 반환 된 후에 삭제된다는 것을 의미합니다. 동적으로 'QTimer * timer = new QTimer' 또는 그 이상을 할당하십시오 - 타이머를 클래스 멤버로 만드십시오. – dtech
나는 타이머가 버튼이나 어떤 종류의 것을 클릭하기를 바라는 지 의심 스럽다. 버튼 클릭과 연결된 모든 액션을 타이머가 호출하도록합니다. 그것은 아주 다릅니다. –