Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

[Предыдущий: Урок 5] [Учебное пособие] [Следующий: Урок 7]

Урок 6 - Строим множество блоков!

Файлы:

Снимок экрана к Уроку 6

В этом примере мы рассмотрим, как объединить два виджета в новый компонент, а также как просто работать с большим количеством виджетов. Сначала мы используем пользовательский виджет в качестве дочернего.

 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 **
 ****************************************************************************/

 #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();
 }

Разберем программу строка за строкой

 class LCDRange : public QWidget
 {
 public:
     LCDRange(QWidget *parent = 0);
 };

Класс виджета LCDRange не имеет своего 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 также не имеет собственных методов и состоит только из конструктора.

 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;

Мы создаём QWidget с QGridLayout, содержащим три столбца.

QGridLayout автоматически размещает виджеты по строкам и столбцам; вы можете указать номер столбца и строки, куда хотите разместить свой виджет и QGridLayout поместит его в сетку.

     for (int row = 0; row < 3; ++row) {
         for (int column = 0; column < 3; ++column) {
             LCDRange *lcdRange = new LCDRange;
             grid->addWidget(lcdRange, row, column);
         }
     }

В этих строчках мы создаем 9 виджетов LCDRange, все они являются дочерними по отношению к сетке и расположены в трех строках по три столбца.

     QVBoxLayout *layout = new QVBoxLayout;
     layout->addWidget(quit);
     layout->addLayout(grid);
     setLayout(layout);
 }

В конце концов, мы добавляем кнопку Quit и компоновку сетки, содержащую виджеты LCDRange, в главную компоновку. Функция QWidget::addLayout(), подобно QWidget::addWidget(),помещает переданный слой в главный в качестве потомка.

Вот и всё.

Запуск приложения

Эта программа показывает, как просто работать со множеством виджетов одновременно. Все они ведут себя так же, как слайдер и ЖК-индикатор из предыдущего урока. Основное отличие заключается в реализации.

Домашнее задание

При запуске программы инициализируйте каждый слайдер разными случайными значениями.

[Предыдущий: Урок 5] [Учебное пособие] [Следующий: Урок 7]


Copyright © 2008 Trolltech Торговые марки
Qt 4.3.5