2016-12-17 28 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

相關問題