我想使用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
没有在该函数中更新,或者该函数仅是第一次调用?
答案 0 :(得分:1)
在函数QLed::setLEDFlashing
中,创建QTimer
的本地实例,该实例将在函数末尾销毁。
您应该将QTimer
声明为类的属性,或者将内部计时器与QObject::startTimer一起使用