我試着在我的窗口小部件上使用一個簡單的QTimer
對象,以便我可以計算一個方法完成所花費的時間。但令我驚訝的是,定時器被阻塞,直到方法完成執行!即當有關方法結束時,計時器開始計時!QTimer爲什麼不是異步的?
這裏是一個示例代碼來演示一下我寫的:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_btnTest_clicked();
void OnTimerTick();
private:
Ui::MainWindow *ui;
ulong seconds;
};
#endif // MAINWINDOW_H
這是cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv/cv.h"
#include <QTimer>
#include <QtCore>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnTest_clicked()
{
QTimer * timer = new QTimer(0);
seconds =0;
connect(timer,SIGNAL(timeout()),this,SLOT(OnTimerTick()));
timer->setInterval(100);
timer->start();
QThread::sleep(5);//simulating a method which takes 5 seconds to complete
//timer->stop();
}
void MainWindow::OnTimerTick()
{
ui->lblElapsedTime->setText(QString::number(++seconds));
}
我怎樣才能獲得異步行爲,有點像我們在C#即定時器運行其自己的執行線程?
更新:
感謝澄清,現在我怎麼能合併Qthreads與定時器,我必須從Qthreads繼承和我的孩子課堂上使用定時器或做我必須從QTimer繼承和有線程執行在它!這真是令人困惑!
什麼是QThread :: sleep(5)'? –
模擬工作方法! – Breeze
你確定你不是在尋找'QElapsedTime'嗎? 'QTimer'用於在一段時間過後觸發某些工作。 – peppe