你好,我试图用两个线程在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)) ;
希望它能对某人有所帮助
答案 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