QT插槽忽略while循环

时间:2020-03-23 18:50:45

标签: multithreading qt

你好,我试图用两个线程在QT中创建一个应用程序,但是我有一个问题: 我有一个插槽,当我单击按钮时,该插槽就会运行,并且在单击时,它应该更改名为lValeur的标签的名称。但是它只更改一次文本。播放帮助我我想死...

这是我的代码中有趣的部分:

    void IHM::ClicButtonPer()
{
    ButtonDem->setEnabled(true) ;
    ButtonPer->setEnabled(false) ;
    QString val ;
    QTimer attendre ;
    do
    {
        val = "Valeur : " ;
        val += valeur ;
        lValeur->setText(val) ;
        attendre.start(1000) ;
        while(attendre.isActive())
            QApplication::processEvents() ;
        if(ButtonPer->isEnabled())
            break ;
    }while(1) ;
}

和执行插槽的连接功能:

connect(ButtonPer, SIGNAL(clicked()), this, SLOT(ClicButtonPer())) ;

编辑:这是多线程的,因为我还有另一个与TCP服务器通信的线程

编辑2:

connect(&m_timer, &QTimer::timeout, this, &IHM::on_timer);

这段代码只是在&IHM :: on_timer上给我返回一个错误:无法接受类型为'void'的右值的地址

编辑3(和最后一个):

我更改connect(&m_timer, &QTimer::timeout, this, &IHM::on_timer);connect(&m_timer, SIGNAL(timeout()), this, SLOT(on_timer)) ; 希望它能对某人有所帮助

1 个答案:

答案 0 :(得分:1)

非常奇怪的代码。您需要学习编程的基础知识。计时器是在循环中不使用的实体。通常使用计时器以预定的相等时间间隔重复执行任何操作,但要避免循环。

关于Qt和QTimer类
您需要在非本地范围内创建QTimer对象。您可以将变量声明添加到IHM类头中。在最简单的情况下,您还需要创建一个slot方法。

class IHM : public...
{
     ...
private:
    QTimer m_timer;

private slots:
    void on_timer();
}

然后,在IHM cpp文件中,您需要将计时器的timeout信号连接到插槽。可以在IHM构造函数中完成。

connect(&m_timer, &QTimer::timeout, this, &IHM::on_timer);

将需要重复调​​用的代码放入插槽主体。在需要的地方启动和停止计时器。例如:

void IHM::ClicButtonPer()
{
    ...
    m_timer.start(1000);
}

void IHM::on_timer()
{
    ...
    val += valeur;
    lValeur->setText(val);

    if(ButtonPer->isEnabled())
    {
        m_timer.stop();
    }     
}

关于问题“它仅更改一次文本” ,您需要阅读有关Qt事件循环的信息。我可以建议
Signals & Slots
Threads_Events_QObjects
您还可以在attendre.start(1000);行设置一个断点,然后继续进行下去,看看实际满足什么条件。

另请参阅:
Threading Basics
Multithreading Technologies in Qt
Threads and QObjects