diff options
Diffstat (limited to 'examples/scxml/trafficlight-common/trafficlight.cpp')
-rw-r--r-- | examples/scxml/trafficlight-common/trafficlight.cpp | 87 |
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(); } |