红绿灯程序代码
#include
class LightWidget : public QWidget
{
Q_OBJECT
timeout on t2 timerQ_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)
{
QHBoxLayout *hbox = new QHBoxLayout(this);//水平布局
m_red = new LightWidget(Qt::red);
hbox->addWidget(m_red);
m_yellow = new LightWidget(Qt::yellow);
hbox->addWidget(m_yellow);
m_green = new LightWidget(Qt::green);
hbox->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)
{
QHBoxLayout *hbox = new QHBoxLayout(this);
TrafficLightWidget *widget = new TrafficLightWidget();
hbox->addWidget(widget);
hbox->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;
size(300, 110);//设置窗体大小widget.show();
();
}
#"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论