红绿灯程序代码

红绿灯程序代码


2023年12月27日发(作者:)

#include

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);

derHint(QPainter::Antialiasing);//反锯齿

sh(m_color);

lipse(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();

or(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;

(300, 110);//设置窗体大小

();

return ();

}

#include ""


发布者:admin,转转请注明出处:http://www.yc00.com/news/1703673459a1310727.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信