Я изучаю Qt, и у меня возникла идея включать и выключать светодиод с помощью кнопок, у меня все получилось, но я не мог понять, как реализовать то же самое с помощью кнопки переключения. Я буду публиковать код ниже, пожалуйста, посмотрите и дайте мне знать, как я могу реализовать вышеупомянутое поведение.
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();
}
}
но вышеуказанная процедура не работает. Я попытался запустить его в режиме отладки, чтобы узнать, какую ошибку я допустил, она показывает ошибку «Ошибка сегментации».
Задача ещё не решена.
Других решений пока нет …