6

我已经为此工作了几个小时,无法弄清楚,也找不到任何有效的在线帮助。基本上,我想要完成的要点是拥有一个带有按钮和QTextBrowser. 当我按下按钮时,我希望它显示一条消息,然后每 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() while 循环,但它不会简单地停留在那里。

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

必须有一个简单的方法来做到这一点,但我使用 Qt 的记录一直是

4

5 回答 5

7

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

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

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

于 2011-01-14T19:35:10.533 回答
4

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

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

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

基本上,您想创建一个附加的插槽,然后将其连接到timeout信号并启动计时器。计时器将滴答作响,每一秒都会调用该插槽。在您的情况下,您将更1000改为10000

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

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

于 2011-01-14T19:35:18.067 回答
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_;
}
于 2011-01-15T00:47:42.683 回答
1

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

于 2011-01-14T19:48:02.237 回答
1

我以为 OP 想每 10 秒重复显示一次消息?

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

于 2011-01-14T20:03:22.453 回答