2016-10-06 1 views
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으로 이해할 수 있습니다.

+1

생성자에서 로컬로 타이머를 만들면 타이머가 생성자가 반환 된 후에 삭제된다는 것을 의미합니다. 동적으로 'QTimer * timer = new QTimer' 또는 그 이상을 할당하십시오 - 타이머를 클래스 멤버로 만드십시오. – dtech

+0

나는 타이머가 버튼이나 어떤 종류의 것을 클릭하기를 바라는 지 의심 스럽다. 버튼 클릭과 연결된 모든 액션을 타이머가 호출하도록합니다. 그것은 아주 다릅니다. –

답변

관련 문제