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