|
[Предыдущий: Урок 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]
|