Traffic Light Example▲
In this example we write a TrafficLightWidget class. The traffic light has three lights: Red, yellow and green. The traffic light transitions from one light to another (red to yellow to green to yellow to red again) at certain intervals.
class
LightWidget : public
QWidget
{
Q_OBJECT
Q_PROPERTY(bool
on READ isOn WRITE setOn)
public
:
LightWidget(const
QColor &
amp;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
:
void
paintEvent(QPaintEvent *
) override
{
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;
}
;
The LightWidget class represents a single light of the traffic light. It provides an on property and two slots, turnOn() and turnOff(), to turn the light on and off, respectively. The widget paints itself in the color that's passed to the constructor.
class
TrafficLightWidget : public
QWidget
{
public
:
TrafficLightWidget(QWidget *
parent =
0
)
:
QWidget(parent)
{
QVBoxLayout *
vbox =
new
QVBoxLayout(this
);
m_red =
new
LightWidget(Qt::
red);
vbox-&
gt;addWidget(m_red);
m_yellow =
new
LightWidget(Qt::
yellow);
vbox-&
gt;addWidget(m_yellow);
m_green =
new
LightWidget(Qt::
green);
vbox-&
gt;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;
}
;
The TrafficLightWidget class represents the visual part of the traffic light; it's a widget that contains three lights arranged vertically, and provides accessor functions for these.
QState *
createLightState(LightWidget *
light, int
duration, QState *
parent =
0
)
{
QState *
lightState =
new
QState(parent);
QTimer *
timer =
new
QTimer(lightState);
timer-&
gt;setInterval(duration);
timer-&
gt;setSingleShot(true
);
QState *
timing =
new
QState(lightState);
QObject::
connect(timing, SIGNAL(entered()), light, SLOT(turnOn()));
QObject::
connect(timing, SIGNAL(entered()), timer, SLOT(start()));