Qt:Документация 4.3.2/tutorial-t6

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
40px Внимание: Актуальная версия перевода документации находится здесь

__NOTOC__

Image:qt-logo.png

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

Image:trolltech-logo.png

[Предыдущая: Часть 5 ] [ Учебное пособие ] [Следующая: Часть 7 ]

Содержание

[править] Урок 6 - Строим множество блоков!

Файлы:

Файл:T6.png

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

 #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 © 2007 Trolltech Trademarks
Qt 4.3.2