2016-12-17 77 views
0

我试图向QTextBrowser输出“Some text”,连续“n”次。其中“n”是整数。为此,我使用QTimer :: SingleShot进行计时。一旦超时被触发,FLAG被设置为假,并且当FLAG为假时,在“循环”中监视该“标记”,并且它应该插入文本直到标记被设置为假。 FLAG的初始值为true。在while(1)循环中插入文本到QT中的文本编辑器

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QThread> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    FLAG = true; 

} 

void MainWindow::on_pushButton_clicked() 
{ 
    ui->pushButton->setEnabled(false); 
    RunTheTimer(); 
    int counter = 0; 

    do 
    { 
     ui->textBrowser->insertPlainText(QString("Inside While loop %1 \n").arg(counter++)); 
     counter++; 
    }while(FLAG); 

    FLAG = true; 

} 
void MainWindow::RunTheTimer() 
{ 
    ui->textBrowser-> insertPlainText("Timer Started"); 
    QTimer::singleShot(60000, this, SLOT(Update()));// One Minute 

} 

void MainWindow::Update() 
{ 
    ui->textBrowser-> insertPlainText("Timeout signal triggered"); 
    ui->pushButton->setEnabled(true); 
    FLAG = false; 
} 
MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

应用程序正在挂起,当我单击按钮。 调试后我发现,一旦执行进入while(1)循环和应用程序无法在(1)循环内插入任何文本时,超时不会被触发。为什么会这样?我究竟做错了什么?

谢谢。

回答

4

不必返回控制事件循环,Qt中许多事情不是设计没有一个事件循环工作,看一看this page from the Qt wiki,你的情况:

  • QTextBrowser将无法以显示新添加的文本,因为这要求小部件能够接收绘画事件(并且没有事件循环,这是不可能的)。
  • 将您的标志设置为false的计时器将无法启动,因为您的程序始终忙于执行您的while循环,并且它将无法执行任何操作(除非它从该循环中跳出while循环如果它没有将你的标志设置为false,这是不可能的......)。

而不是使用一个无限循环,如果你想尽可能多次地执行的东西,你可以使用一个QTimer及其interval属性设置为0,这是使定时器一旦超时特殊值因为事件循环完成处理事件队列中的所有事件。

使用上述方法而不是无限循环,您可以使用另一个计时器在特定时间段后停止上述计时器,并且您不必担心未到达的事件,并且定时器自事件发生后不会触发循环总是现在执行。

这里是一个可能实现上述办法的:

screenshot

#include <QtWidgets> 

int main(int argc, char* argv[]){ 
    QApplication a(argc, argv); 

    //set up GUI 
    QWidget widget; 
    QVBoxLayout layout(&widget); 
    QTextBrowser textBrowser; 
    QPushButton button("Add Text"); 
    layout.addWidget(&textBrowser); 
    layout.addWidget(&button); 

    //timer with 0 interval instead of while loop 
    QTimer workTimer; 
    workTimer.setInterval(0); 
    int counter=0; 
    QObject::connect(&workTimer, &QTimer::timeout, [&]{ 
     //add text to textBrowser whenever the workTimer fires 
     textBrowser.append(QStringLiteral("Additional Text %1").arg(counter++)); 
    }); 
    //when the button is clicked 
    QObject::connect(&button, &QPushButton::clicked, [&]{ 
     //start work timer 
     workTimer.start(); 
     button.setEnabled(false); 
     //stop work timer after 5 seconds 
     QTimer::singleShot(5000, [&]{ 
      workTimer.stop(); 
      button.setEnabled(true); 
     }); 
    }); 
    widget.show(); 

    return a.exec(); 
} 
+0

很好的解释,问题解决 – learner

+0

注意'[和](){...}'可以简单地写成'[&] {...}'。 –

+0

@KubaOber,感谢您的注意:) – Mike

相关问题