将Qtimer与小部件连接

时间:2019-02-21 19:34:34

标签: qt

我想使用QTimer对象来控制LED指示器状态。创建了一个继承自QLed的{​​{1}}类来控制LED指示器。以下是与之相关的两个主要功能:

QWidget

void QLed::setLEDFlashing(bool value) { ledStatus = value; //Boolean value to accept a user-defined LED status m_value = ledStatus; //m_value is used in painting LED (with QtSvgRenderer) QTimer ledTimer; ledTimer.setInterval(300); if(!ledTimer.isActive()) { ledTimer.start(); } //Here is the connection between the timer and this (i.e., QLed*) object connect(&ledTimer, SIGNAL(timeout()), this, SLOT(setLEDFlashingTimerHandler())); } //I want to use this function to make LED keep flashing void QLed::setLEDFlashingTimerHandler() { //qDebug()<<"setLEDFlashingTimerHandler()"; if (ledStatus) { m_value = TRUE; ledStatus = FALSE; } else { m_value = FALSE; ledStatus =TRUE; } } //This is to paint the LED widget void QLed::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); //based on m_value, different svg file is loaded if(m_value) ledShapeAndColor.append(colors[m_onColor]); else ledShapeAndColor.append(colors[m_offColor]); renderer->load(ledShapeAndColor); renderer->render(&painter); //qDebug()<<"paintEvent m_value="<<m_value; } 中,添加一个mainwindow.ui对象(名为QLabel)并将其提升为led,并在QLed中:

mainwindow.cpp

以上代码不能导致LED指示灯闪烁。实际上,ui->led->setLEDFlashing(TRUE); ledTimer之间的连接由于某些原因没有生效,并且setLEDFlashingTimerHandler中的m_value未更新。任何人都可以帮助调试我的代码吗?谢谢!

编辑:

我已经通过使用paintEvent代替了QTimer *ledTimer解决了连接问题。但是绘画仍然不能按预期方式工作,因为QTimer ledTimer没有在该函数中更新,或者该函数仅是第一次调用?

1 个答案:

答案 0 :(得分:1)

在函数QLed::setLEDFlashing中,创建QTimer的本地实例,该实例将在函数末尾销毁。

您应该将QTimer声明为类的属性,或者将内部计时器与QObject::startTimer一起使用