为什么QTimer不是异步的?

时间:2015-10-10 19:03:38

标签: c++ qt 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#中所拥有的那样,即Timer运行自己的执行线程?

更新
感谢您的澄清,现在我如何将Qthreads与计时器合并,我是否必须从Qthreads继承并在我的子类中使用计时器,或者我必须继承QTimer并在其中执行一个线程!真是令人困惑!

1 个答案:

答案 0 :(得分:5)

这是Qt,WinForms,WPF等的常见行为。

所有与UI相关的事件在UI线程上逐个同步执行。事件处理程序不会执行长时间执行以避免阻塞。如果要执行长任务,则应该在其他线程中执行。

QTimer旨在提升UI线程上的事件。这很好,因为您确定当时没有其他事件处理程序正在执行。