admin 管理员组文章数量: 1086019
2024年3月11日发(作者:serializearray怎么用)
#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,
yellowGoingGreen);
SIGNAL(finished()),
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,
redGoingYellow);
SIGNAL(finished()),
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 ""
版权声明:本文标题:红绿灯程序代码 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1710118864a558640.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论