2011-01-14 434 views
5

我在這方面的工作了幾個小時,不能弄明白也可以找到任何幫助網上的作品。基本上我想要完成的是要有一個Qt GUI和一個按鈕和一個QTextBrowser。當我按下按鈕時,我希望它顯示一條消息,然後每隔10秒繼續打印一次該消息。Qt:如何使用QTimer每隔10秒將消息打印到QTextBrowser?

我想我會使用QTimer,因爲它是有道理的有一個定時器diplay消息每10秒。當我最初實現這個到我buttonClicked()SLOT它導致程序凍結。我在網上尋找解決方案,並找到QApplication :: processEvents()。

所以在我的功能基本上我有這樣的事情:

while(1) 
{ 
    QTimer *timer; 
    connect(...) //omitted parameters for this example  
    timer.start(10000); 
    ui->diplay->append("Message"); 

    while(timer.isActive()) 
    { 
     QApplication::processEvents() 
    } 
} 

我想它會跳出timer.isActive()的while循環,但它不會簡單地停留在那裏。

所以我想這是一個線程問題。所以我想出瞭如何使用QThreads,但我仍然無法使它工作。基本上,當我創建一個帶有定時器的線程並且線程告訴定時器啓動時,程序關閉,控制檯顯示「程序意外完成」。

必須有一個簡單的方法來做到這一點,但我使用Qt的紀錄一直是個

+0

更新:我現在用的timer-> singleShot(定時器,SIGNAL(超時()),這一點,SLOT(更新())) ;但我需要程序來打印消息並等待10秒鐘,然後繼續處理。我把它放在一個while循環中,所以它每10秒就會不斷地執行singleShots而不是每一次。有什麼建議麼?謝謝! – 2011-01-14 21:55:18

+1

幾乎所有人都錯過了這個事情發生在一段時間(1)循環?難怪程序是凍結的。 – 2011-01-20 17:15:57

回答

6

如果你想顯示你的10秒消息,更好的方式來做到這一點,是創建一個您的應用程序中將刪除郵件的插槽。然後,在你按下按鈕插槽,添加您的留言並初始化一個計時器,將觸發您的移去消息插槽10S:

QTimer::singleShot(10000, this, SLOT(eraseMessageSlot())); 

而且,也沒有必要對一個線程有...

+0

我以爲我需要線程,因爲它凍結,但顯然我只是有一個不正確的連接。 – 2011-01-14 21:51:36

+0

請在OP中查看我的更新。謝謝! – 2011-01-14 22:06:25

4

你代碼有很多問題 - 我假設它是僞代碼,本質上,因爲timer不存在等事情。

退房的QTimer參考。它有一個例子:

QTimer *timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(update())); 
timer->start(1000); 

基本上,你想的是附加一個插槽中,然後將其連接到timeout信號同時開始計時。計時器將打勾並且每秒都會調用該插槽。在你的情況下,你會將1000更改爲10000

如果這不起作用,那麼問題究竟是什麼?我不明白你爲什麼使用線程,除非你需要它們。

編輯看着你的更新,你說你想等待10秒鐘。爲什麼不繼續在您的插槽中的程序(由singleShot調用)而不是忙碌等待?我認爲你缺少一些Qt的理念......

1

默認情況下,直到你停止它QTimer就會觸發每間隔。這就是爲什麼timer.isActive()永遠是真的。使用timer.setSingleShot(true)使定時器只觸發一次。 (或者使用QTimer::singleShot在@ Tibur酒店的帖子。)

1

我認爲OP希望重複顯示的消息每10secs?

在這種情況下,只需創建一個定時器,使用定時器信號連接updateDisplay()函數槽並啓動定時器。

4

這將是更好地組織你的程序是這樣的:

class MainWindow : QWidget //or any other parent class 
{ 
public: 
MainWindow() 
{ 
    QPushButton *button = new QPushButton(this); 
    browser_ = new QTextBrowser(this); //and some params maybe 
    QVBoxLayout * layout = new QVBoxLayout(this); //can be used another layout 
    layout->addWidget(button); 
    layout->addWidget(browser_); 

    connect(button, SIGNAL(pressed()), 
     this, SLOT(onButtonPressed())); 

    timer_ = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), 
     this, SLOT(timerHandler())); 
    } 
    ~MainWindow(); 

public slots: 
    void onButtonPressed() 
    { 
     timerHandler(); //to display message when button is pressed 
     if (!timer->isActive()) timer->start(TIMER_INTERVAL); //TIMER_INTERVAL = 10000; 
    } 
    void timerHandler() 
    { 
     //put your code to display message here 
    } 

private: 
    QTextBrowser *browser_; 
    QTimer *timer_; 
}