Qt:Документация 4.3.2/tutorial-t6
Материал из Wiki.crossplatform.ru
![]() | Внимание: Актуальная версия перевода документации находится здесь |
__NOTOC__
Главная · Все классы · Основные классы · Классы по группам · Модули · Функции |
[Предыдущая: Часть 5 ] [ Учебное пособие ] [Следующая: Часть 7 ]
Содержание |
Урок 6 - Строим множество блоков!
Файлы:
В этом примере мы расмотрим, как объединить два виджета в новый компонент, а также как просто работать с большим количеством виджетов. Также мы узнаем, как пользовательский виджет использовать в качестве дочернего.
#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
|