|
信号链的示例: 一个信号的产生会引发另一个信号的产生 信号之间可以进行自由关联 #ifndef LCDRANGE_H #define LCDRANGE_H #include <QWidget> class QSlider; class LCDRange:public QWidget { Q_OBJECT public: LCDRange(QWidget *parent=0); int value() const; public slots: void setValue(int value); signals: void valueChanged(int newValue); private: QSlider *slider; }; #endif #include <QLCDNumber> #include <QSlider> #include <QVBoxLayout> #include "lcdrange.h" LCDRange::LCDRange(QWidget *parent):QWidget(parent) { QLCDNumber *lcd=new QLCDNumber(2); slider=new QSlider(Qt::Horizontal); slider->setRange(0,99); slider->setValue(0); connect(slider,SIGNAL(valueChagned(int)),lcd,SLOT(display(int))); connect(slider,SIGNAL(valueChanged(int)),this,SIGNAL(valueChanged(int)));//信号关联 QVBoxLayout *layout=new QVBoxLayout; layout->addWidget(lcd); layout->addWidget(slider); setLayout(layout); } int LCDRange::value() const { return slider->value(); } void LCDRange::setValue(int value) { slider->setValue(value); } #include <QApplication> #include <QFont> #include <QGridLayout> #include <QLCDNumber> #include <QPushButton> #include <QWidget> #include "lcdrange.h" class MyWidget:public QWidget { public: MyWidget(QWidget *parent=0); }; MyWidget::MyWidget(QWidget *parent):QWidget(parent) { QPushButton *quit=new QPushButton("Quit"); quit->setFont(QFont("Times",18,QFont::Bold)); connect(quit,SIGNAL(clicked()),qApp,SLOT(quit())); QGridLayout *grid=new QGridLayout; LCDRange *previousRange=0; for(int row=0;row<4;++row) { for(int column=0;column<4;++column) { LCDRange *lcdRange=new LCDRange; grid->addWidget(lcdRange,row,column); if(previousRange) connect(lcdRange,SIGNAL(valueChanged(int)),previousRange,SLOT(setValue(int))); previousRange=lcdRange; } } QVBoxLayout *layout=new QVBoxLayout; layout->addWidget(quit); layout->addLayout(grid); setLayout(layout); } int main(int argc,char **argv) { QApplication app(argc,argv); MyWidget wi; wi.show(); return app.exec(); }
|