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 ""


本文标签: 水平 计时器 设置 布局