Импульсный светодиод на кнопке переключения в QT

Я изучаю Qt, и у меня возникла идея включать и выключать светодиод с помощью кнопок, у меня все получилось, но я не мог понять, как реализовать то же самое с помощью кнопки переключения. Я буду публиковать код ниже, пожалуйста, посмотрите и дайте мне знать, как я могу реализовать вышеупомянутое поведение.

GIF показывает поведение

pulseledwidget.h

#ifndef PULSINGLEDWIDGET_H
#define PULSINGLEDWIDGET_H

#include <QLabel>
#include <QPixmap>
#include <QTimer>
#include <QObject>
#include <QDebug>

class pulsingLedWidget : public QLabel
{
Q_OBJECT
public:
explicit pulsingLedWidget(QWidget *parent = 0);
public slots:
void startPulsing();
void extinguish();
private:
QPixmap onPixmap,offPixmap;
QTimer timer;
bool state;
};

#endif // PULSINGLEDWIDGET_H

pulseledwidget.cpp

#include "pulsingledwidget.h"
pulsingLedWidget::pulsingLedWidget(QWidget *parent) : QLabel(parent)
{
onPixmap.load(":/ledon.png");
offPixmap.load(":/ledoff.png");

state = true;

setPixmap(offPixmap);
timer.setInterval(200);
connect(&timer,SIGNAL(timeout()),this,SLOT(startPulsing()));
}

void pulsingLedWidget::startPulsing()
{
timer.start();
if(state)
{
setPixmap(onPixmap);
state = false;
}
else
{
setPixmap(offPixmap);
state = true;
}
}

void pulsingLedWidget::extinguish()
{
timer.stop();
setPixmap(offPixmap);
}

leddialog.h

#ifndef LEDDIALOG_H
#define LEDDIALOG_H

#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>
#include "pulsingledwidget.h"
class ledDialog : public QDialog
{
Q_OBJECT
public:
explicit ledDialog(QWidget *parent = 0);
private:
QPushButton *onbutton;
QPushButton *offbutton;
QVBoxLayout *layout;
pulsingLedWidget *ledwidget;
};

#endif // LEDDIALOG_H

leddialog.cpp

#include "leddialog.h"
ledDialog::ledDialog(QWidget *parent) : QDialog(parent)
{
QPushButton *onbutton = new QPushButton("On");
QPushButton *offbutton = new QPushButton("Off");
QVBoxLayout *layout = new QVBoxLayout(this);
pulsingLedWidget *ledwidget = new pulsingLedWidget(this);

ledwidget->setAlignment(Qt::AlignCenter);

layout->addWidget(ledwidget);
layout->addWidget(onbutton);
layout->addWidget(offbutton);

resize(150,200);
connect(onbutton,SIGNAL(clicked(bool)),ledwidget,SLOT(startPulsing()));
connect(offbutton,SIGNAL(clicked(bool)),ledwidget,SLOT(extinguish()));

}

Что я пробовал:

leddialog.h

#ifndef LEDDIALOG_H
#define LEDDIALOG_H

#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>
#include "pulsingledwidget.h"
class ledDialog : public QDialog
{
Q_OBJECT
public:
explicit ledDialog(QWidget *parent = 0);
private slots:
void makeDecision(bool state);
private:
QPushButton *onbutton;
QPushButton *offbutton;
QVBoxLayout *layout;
pulsingLedWidget *ledwidget;
};

#endif // LEDDIALOG_H

leddialog.cpp

#include "leddialog.h"
ledDialog::ledDialog(QWidget *parent) : QDialog(parent)
{
QPushButton *onbutton = new QPushButton("On");
QPushButton *offbutton = new QPushButton("Off");
QVBoxLayout *layout = new QVBoxLayout(this);
pulsingLedWidget *ledwidget = new pulsingLedWidget(this);

ledwidget->setAlignment(Qt::AlignCenter);

onbutton->setCheckable(true);

layout->addWidget(ledwidget);
layout->addWidget(onbutton);
layout->addWidget(offbutton);

resize(150,200);
connect(onbutton,SIGNAL(toggled(bool)),this,SLOT(makeDecision(bool)));

}

void ledDialog::makeDecision(bool state)
{
if(state)
{
ledwidget->startPulsing();
}
else
{
ledwidget->extinguish();
}
}

но вышеуказанная процедура не работает. Я попытался запустить его в режиме отладки, чтобы узнать, какую ошибку я допустил, она показывает ошибку «Ошибка сегментации».

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]