Подключите Qtimer с виджетом - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу использовать объект QTimer для управления состоянием светодиодного индикатора.Класс QLed, унаследованный 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:

ui->led->setLEDFlashing(TRUE);

Приведенные выше коды не могут привести к миганию светодиодного индикатора.На самом деле, связь между ledTimer и setLEDFlashingTimerHandler по какой-то причине НЕ вступает в силу, и m_value не обновляется в paintEvent.Кто-нибудь может помочь отладить мои коды?Спасибо!

Правки:

Я решил проблему с подключением, используя QTimer *ledTimer вместо QTimer ledTimer.Но рисование все еще не работает должным образом, так как m_value не обновляется в этой функции или функция вызывается только в первый раз?

1 Ответ

0 голосов
/ 21 февраля 2019

В вашей функции QLed::setLEDFlashing вы создаете локальный экземпляр QTimer, который будет уничтожен в конце вашей функции.

Вы должны объявить свой QTimer как атрибут вашего класса илииспользовать внутренний таймер с QObject :: startTimer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...