.tutorials/tutorial/t6/t6.pro
這個範例展示了如何封裝兩個元件成一個新的組件,以及使用許多元件有多麼容易。首先,我們使用一個自訂的元件作為一個子元件。
#include <QApplication> #include <QFont> #include <QGridLayout> #include <QLCDNumber> #include <QPushButton> #include <QSlider> #include <QVBoxLayout> #include <QWidget> class LCDRange : public QWidget { public: LCDRange(QWidget *parent = 0); }; LCDRange::LCDRange(QWidget *parent) : QWidget(parent) { QLCDNumber *lcd = new QLCDNumber(2); lcd->setSegmentStyle(QLCDNumber::Filled); QSlider *slider = new QSlider(Qt::Horizontal); slider->setRange(0, 99); slider->setValue(0); connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(lcd); layout->addWidget(slider); setLayout(layout); } class MyWidget : public QWidget { public: MyWidget(QWidget *parent = 0); }; MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { QPushButton *quit = new QPushButton(tr("Quit")); quit->setFont(QFont("Times", 18, QFont::Bold)); connect(quit, SIGNAL(clicked()), qApp, SLOT(quit())); QGridLayout *grid = new QGridLayout; for (int row = 0; row < 3; ++row) { for (int column = 0; column < 3; ++column) { LCDRange *lcdRange = new LCDRange; grid->addWidget(lcdRange, row, column); } } QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(quit); layout->addLayout(grid); setLayout(layout); } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.show(); return app.exec(); }
Line by Line Walkthrough
class LCDRange : public QWidget { public: LCDRange(QWidget *parent = 0); };
LCDRange 是一個沒有任何 API 的元件。它只有一個建構子。這種元件不是很有用,所以稍後我們將會加入一些 API。
LCDRange::LCDRange(QWidget *parent) : QWidget(parent) { QLCDNumber *lcd = new QLCDNumber(2); lcd->setSegmentStyle(QLCDNumber::Filled); QSlider *slider = new QSlider(Qt::Horizontal); slider->setRange(0, 99); slider->setValue(0); connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(lcd); layout->addWidget(slider); setLayout(layout); }
這裡直接抄襲了第五章的 MyWidget 建構子。唯一的不同是省略了 Quit 按紐,而且這個類別被重新命名了。
class MyWidget : public QWidget { public: MyWidget(QWidget *parent = 0); };
MyWidget 同樣除了建構子之外沒有其他 API。
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { QPushButton *quit = new QPushButton(tr("Quit")); quit->setFont(QFont("Times", 18, QFont::Bold)); connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
這個過去在改名為 LCDRange 類別裡的按鈕被分隔出來,如此我們便可以有一個 Quit 按紐以及許多 LCDRange 物件。
QGridLayout *grid = new QGridLayout;
我們建立了一個將會包含三行(column)的 QGridLayout。
QGridLayout 會自動把它的元件排列到列(row)與行中。你可以在加入元件時指定列數及行數,而 QGridLayout 將會把它們設置在網格(grid)中。
for (int row = 0; row < 3; ++row) { for (int column = 0; column < 3; ++column) { LCDRange *lcdRange = new LCDRange; grid->addWidget(lcdRange, row, column); } }
我們建立了九個 LCDRange 元件,它們全都是網格物件的子元件,我們將它們排列成三行三列。
QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(quit); layout->addLayout(grid); setLayout(layout); }
最後,我們將 Quit 按紐以及包含 LCDRange 元件的網格版面配置加入到主版面配置中。QWidget::addLayout() 函式類似於 QWidget::addWidget() 函式,使特定的版面配置成為一個主版面配置的子配置。
就是這樣。
Running the Application
這支程式顯示了同時使用許多元件有多麼容易。其中每一個元件的行為都像是前一章裡的 LCD 數字與滾動軸。再一次地,它們的不同點在於實現。
Exercises
在開始時初始化每一個滾動軸為不同 / 隨機的值。
來源:Qt Tutorial 6 - Building Blocks Galore!
版本:4.4.3
0 回覆:
張貼留言