summaryrefslogtreecommitdiffstats
path: root/examples/scxml/trafficlight-common/trafficlight.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scxml/trafficlight-common/trafficlight.cpp')
-rw-r--r--examples/scxml/trafficlight-common/trafficlight.cpp87
1 files changed, 62 insertions, 25 deletions
diff --git a/examples/scxml/trafficlight-common/trafficlight.cpp b/examples/scxml/trafficlight-common/trafficlight.cpp
index 7341c96..6cbed1b 100644
--- a/examples/scxml/trafficlight-common/trafficlight.cpp
+++ b/examples/scxml/trafficlight-common/trafficlight.cpp
@@ -56,19 +56,17 @@ class TrafficLightWidget : public QWidget
{
public:
TrafficLightWidget(QWidget *parent = 0)
- : QWidget(parent)
+ : QWidget(parent), m_background(QLatin1String(":/background.png"))
{
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);
+ vbox->setContentsMargins(0, 40, 0, 80);
+ m_red = new LightWidget(QLatin1String(":/red.png"));
+ vbox->addWidget(m_red, 0, Qt::AlignHCenter);
+ m_yellow = new LightWidget(QLatin1String(":/yellow.png"));
+ vbox->addWidget(m_yellow, 0, Qt::AlignHCenter);
+ m_green = new LightWidget(QLatin1String(":/green.png"));
+ vbox->addWidget(m_green, 0, Qt::AlignHCenter);
+ setLayout(vbox);
}
LightWidget *redLight() const
@@ -78,7 +76,20 @@ public:
LightWidget *greenLight() const
{ return m_green; }
+ virtual void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE
+ {
+ QPainter painter(this);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.drawImage(0, 0, m_background);
+ }
+
+ virtual QSize sizeHint() const Q_DECL_OVERRIDE
+ {
+ return m_background.size();
+ }
+
private:
+ QImage m_background;
LightWidget *m_red;
LightWidget *m_yellow;
LightWidget *m_green;
@@ -88,16 +99,8 @@ TrafficLight::TrafficLight(QScxmlStateMachine *machine, QWidget *parent)
: QWidget(parent)
, m_machine(machine)
{
- QVBoxLayout *vbox = new QVBoxLayout(this);
- TrafficLightWidget *widget = new TrafficLightWidget();
- vbox->addWidget(widget);
- vbox->setMargin(0);
-
- QPushButton *button = new QPushButton;
- vbox->addWidget(button);
- button->setCheckable(true);
- button->setText(QStringLiteral("Pause"));
- connect(button, SIGNAL(toggled(bool)), this, SLOT(toggleWorking(bool)));
+ TrafficLightWidget *widget = new TrafficLightWidget(this);
+ setFixedSize(widget->sizeHint());
Q_ASSERT(machine->init());
@@ -111,6 +114,17 @@ TrafficLight::TrafficLight(QScxmlStateMachine *machine, QWidget *parent)
widget->yellowLight(), SLOT(switchLight(bool)));
machine->connectToState(QStringLiteral("green"),
widget->greenLight(), SLOT(switchLight(bool)));
+
+ QAbstractButton *button = new ButtonWidget(this);
+ auto setButtonGeometry = [this, button](){
+ QSize buttonSize = button->sizeHint();
+ button->setGeometry(width() - buttonSize.width() - 20, height() - buttonSize.height() - 20,
+ buttonSize.width(), buttonSize.height());
+ };
+ connect(button, &QAbstractButton::toggled, this, setButtonGeometry);
+ setButtonGeometry();
+
+ connect(button, &QAbstractButton::toggled, this, &TrafficLight::toggleWorking);
}
void TrafficLight::toggleWorking(bool pause)
@@ -118,9 +132,9 @@ void TrafficLight::toggleWorking(bool pause)
m_machine->submitEvent(pause ? "smash" : "repair");
}
-LightWidget::LightWidget(const QColor &color, QWidget *parent)
+LightWidget::LightWidget(const QString &image, QWidget *parent)
: QWidget(parent)
- , m_color(color)
+ , m_image(image)
, m_on(false)
{}
@@ -144,6 +158,29 @@ void LightWidget::paintEvent(QPaintEvent *)
return;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
- painter.setBrush(m_color);
- painter.drawEllipse(0, 0, width(), height());
+ painter.drawImage(0, 0, m_image);
+}
+
+QSize LightWidget::sizeHint() const
+{
+ return m_image.size();
+}
+
+ButtonWidget::ButtonWidget(QWidget *parent) :
+ QAbstractButton(parent), m_playIcon(QLatin1String(":/play.png")),
+ m_pauseIcon(QLatin1String(":/pause.png"))
+{
+ setCheckable(true);
+}
+
+void ButtonWidget::paintEvent(QPaintEvent *)
+{
+ QPainter painter(this);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.drawImage(0, 0, isChecked() ? m_playIcon : m_pauseIcon);
+}
+
+QSize ButtonWidget::sizeHint() const
+{
+ return isChecked() ? m_playIcon.size() : m_pauseIcon.size();
}