如何使用QTimer每10秒向QTextBrowser打印一条消息?

时间:2011-01-14 19:25:59

标签: multithreading qt qt4 timer qthread

我已经在这工作了几个小时,无法弄明白,也无法找到任何有效的在线帮助。基本上我想要完成的要点就是拥有一个带有按钮和QTextBrowser的Qt GUI。当我按下按钮时,我希望它显示一条消息,然后每隔10秒继续打印此消息。

我想我会使用QTimer,因为有一个计时器每隔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(),但它不会只停留在那里。

所以我认为这是一个线程问题。所以我想出了如何使用QThreads,但我仍然无法让它工作。基本上当我创建一个带有计时器的线程并且线程告诉计时器启动时,程序关闭,控制台显示“程序意外完成”。

必须有一个简单的方法来做到这一点,但我在Qt的跟踪记录一直是那个

5 个答案:

答案 0 :(得分:7)

如果要显示10秒的消息,更好的方法是在应用程序中创建一个将删除消息的插槽。然后,在按钮单击的插槽中,添加消息并初始化一个计时器,该计时器将在10秒内触发删除消息槽:

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

此外,那里不需要线程......

答案 1 :(得分:4)

你的代码有很多问题 - 我认为它是伪代码,本质上是因为timer不存在而且类似的东西。

查看QTimer参考。它有一个例子:

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

基本上,您想要创建一个附加的插槽,然后将其连接到timeout信号并启动计时器。计时器将打开,每秒钟将调用插槽。在您的情况下,您需要将1000更改为10000

如果这不起作用,你遇到的问题究竟是什么?我不明白你为什么要使用线程,除非你还需要它们。

编辑查看您的更新,您说您要等待10秒钟。而不是忙着等待,为什么不继续你的插槽中的程序(由singleShot调用)?我想你错过了一些Qt哲学......

答案 2 :(得分: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_;
}

答案 3 :(得分:1)

默认情况下,QTimer将触发每个间隔,直到您停止它为止。这就是为什么timer.isActive()总是如此。使用timer.setSingleShot(true)仅使计时器触发一次。 (或者在@ tibur的帖子中使用QTimer::singleShot。)

答案 4 :(得分:1)

我认为OP想要每隔10秒重复显示一条消息吗?

在这种情况下,只需创建一个计时器,将updateDisplay()函数插槽与计时器信号连接并启动计时器。