PDA

View Full Version : There is a problem with this code



rezas1000
30th August 2014, 19:59
Hello
Why not run the code below?
thanks

#include <QtWidgets>

class LightWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(bool on READ isOn WRITE setOn)
public:
LightWidget(const QColor &color, QWidget *parent = 0)
: QWidget(parent), m_color(color), m_on(false) {}

bool isOn() const
{ return m_on; }
void setOn(bool on)
{
if (on == m_on)
return;
m_on = on;
update();
}

public slots:
void turnOff() { setOn(false); }
void turnOn() { setOn(true); }

protected:
virtual void paintEvent(QPaintEvent *)
{
if (!m_on)
return;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(m_color);
painter.drawEllipse(0, 0, width(), height());
}

private:
QColor m_color;
bool m_on;
};

class TrafficLightWidget : public QWidget
{
public:
TrafficLightWidget(QWidget *parent = 0)
: QWidget(parent)
{
QVBoxLayout *vbox = new QVBoxLayout(this);
m_red = new LightWidget(Qt::red);
vbox->addWidget(m_red);
m_yellow = new LightWidget(Qt::yellow);
vbox->addWidget(m_yellow);
m_green = new LightWidget(Qt::green);
vbox->addWidget(m_green);
QPalette pal = palette();
pal.setColor(QPalette::Background, Qt::black);
setPalette(pal);
setAutoFillBackground(true);
}

LightWidget *redLight() const
{ return m_red; }
LightWidget *yellowLight() const
{ return m_yellow; }
LightWidget *greenLight() const
{ return m_green; }

private:
LightWidget *m_red;
LightWidget *m_yellow;
LightWidget *m_green;
};

QState *createLightState(LightWidget *light, int duration, QState *parent = 0)
{
QState *lightState = new QState(parent);
QTimer *timer = new QTimer(lightState);
timer->setInterval(duration);
timer->setSingleShot(true);
QState *timing = new QState(lightState);
QObject::connect(timing, SIGNAL(entered()), light, SLOT(turnOn()));
QObject::connect(timing, SIGNAL(entered()), timer, SLOT(start()));
QObject::connect(timing, SIGNAL(exited()), light, SLOT(turnOff()));
QFinalState *done = new QFinalState(lightState);
timing->addTransition(timer, SIGNAL(timeout()), done);
lightState->setInitialState(timing);
return lightState;
}

class TrafficLight : public QWidget
{
public:
TrafficLight(QWidget *parent = 0)
: QWidget(parent)
{
QVBoxLayout *vbox = new QVBoxLayout(this);
TrafficLightWidget *widget = new TrafficLightWidget();
vbox->addWidget(widget);
vbox->setMargin(0);

QStateMachine *machine = new QStateMachine(this);
QState *redGoingYellow = createLightState(widget->redLight(), 3000);
redGoingYellow->setObjectName("redGoingYellow");
QState *yellowGoingGreen = createLightState(widget->yellowLight(), 1000);
yellowGoingGreen->setObjectName("yellowGoingGreen");
redGoingYellow->addTransition(redGoingYellow, SIGNAL(finished()), yellowGoingGreen);
QState *greenGoingYellow = createLightState(widget->greenLight(), 3000);
greenGoingYellow->setObjectName("greenGoingYellow");
yellowGoingGreen->addTransition(yellowGoingGreen, SIGNAL(finished()), greenGoingYellow);
QState *yellowGoingRed = createLightState(widget->yellowLight(), 1000);
yellowGoingRed->setObjectName("yellowGoingRed");
greenGoingYellow->addTransition(greenGoingYellow, SIGNAL(finished()), yellowGoingRed);
yellowGoingRed->addTransition(yellowGoingRed, SIGNAL(finished()), redGoingYellow);

machine->addState(redGoingYellow);
machine->addState(yellowGoingGreen);
machine->addState(greenGoingYellow);
machine->addState(yellowGoingRed);
machine->setInitialState(redGoingYellow);
machine->start();
}
};

int main(int argc, char **argv)
{
QApplication app(argc, argv);

TrafficLight widget;
widget.resize(110, 300);
widget.show();

return app.exec();
}

ChrisW67
30th August 2014, 21:45
What does "not run" about it? You have not provided a description of the problem.

rezas1000
30th August 2014, 22:05
Photo of Code:

10600

wysota
31st August 2014, 08:46
Did you run qmake after adding the Q_OBJECT macro to the class?

rezas1000
31st August 2014, 08:59
Did you run qmake after adding the Q_OBJECT macro to the class?

Yes.it is.

wysota
31st August 2014, 16:58
Is this a cpp or a header file?

rezas1000
31st August 2014, 17:42
thank you.
it is a cpp file.

anda_skoa
31st August 2014, 17:47
Then you have to include the generate moc, something lke


#include "main.moc"

at the end of the file and re-run qmake.

Better would be to put alll the class declarations into a header file.

Cheers,
_