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

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

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

__NOTOC__

Image:qt-logo.png

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

Image:trolltech-logo.png

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

Содержание

[править] Урок 5 - Строим блоки

Файлы:

Файл:T5.png

Следующий пример продемонстирует нам, как создавать и объединять несколько виджетов, как организовать их взаимодействие через слоты и сигналы, а также как обрабатывать изменение размера окна пользователем.

 #include <QApplication>
 #include <QFont>
 #include <QLCDNumber>
 #include <QPushButton>
 #include <QSlider>
 #include <QVBoxLayout>
 #include <QWidget>
 
 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));
 
     QLCDNumber *lcd = new QLCDNumber(2);
     lcd->setSegmentStyle(QLCDNumber::Filled);
 
     QSlider *slider = new QSlider(Qt::Horizontal);
     slider->setRange(0, 99);
     slider->setValue(0);
 
     connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
     connect(slider, SIGNAL(valueChanged(int)),
             lcd, SLOT(display(int)));
 
     QVBoxLayout *layout = new QVBoxLayout;
     layout->addWidget(quit);
     layout->addWidget(lcd);
     layout->addWidget(slider);
     setLayout(layout);
 }
 
 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     MyWidget widget;
     widget.show();
     return app.exec();
 }

[править] Строчка за строчкой

 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));
 
     QLCDNumber *lcd = new QLCDNumber(2);
     lcd->setSegmentStyle(QLCDNumber::Filled);

lcd - экземпляр класса QLCDNumber, который является виджетом и отображает числа в стиле жидкокристалического индикатора. При вызове конструктора этого объекта мы указываем, что отображаться должно 2 цифры. Затем мы устанавливаем свойства QLCDNumber::segmentStyle и QLCDNumber::Filled для того, чтобы сделать более читаемыми отображаемые цифры.

Историческая справка: QLCDNumber был первым виджетом когда-либо написаным для Qt, еще в те времена, когда QPainter поддерживал только один графический примитив: drawLine(). Первоначальный вариант примера Tetrix, который использует QLCDNumber, чтобы отображать очки, был тоже написан в то время.

     QSlider *slider = new QSlider(Qt::Horizontal);
     slider->setRange(0, 99);
     slider->setValue(0);

Пользователь вашей программы сможет коректировать целочисленные значения с помощью виджета QSlider в определённом диапазоне. В этих строчках мы создаем горизонтальный виджет QSlider, определяем диапазон, в котором пользователь может изменять значение (от 0 до 99), и устанавливаем начальное значение 0.

     connect(slider, SIGNAL(valueChanged(int)),
             lcd, SLOT(display(int)));

В этой строчке с помощью механизма сигналов и слотов мы связываем сигнал valueChanged() со слотом виджета LCD display().

Каждый раз, когда мы изменяем положение ползунка, высылается сигнал valueChanged() с новым значением. Посколько мы связали сигнал со слотом display(), он будет вызван при обработке сигнала. Эти виджеты не знают друг о друге. Эта независимость является основой компонентного программирования.

Слоты являются обычными Си++ методами и доступ к ним осуществляется согласно правилам Си++.

     QVBoxLayout *layout = new QVBoxLayout;
     layout->addWidget(quit);
     layout->addWidget(lcd);
     layout->addWidget(slider);
     setLayout(layout);

MyWidget теперь использует QVBoxLayout для управления размещением своих виджетов . Поэтому мы не будем определять координаты виджетов, как мы делали это в предыдущей главе. При использовании схем размещений (слоёв) мы можем быть уверены в правильности расположения наших виджетов при изменениях размера главного виджета. Теперь мы помещаем виджеты quit, lcd и slider в схему, используя QBoxLayout::addWidget().

Функция QWidget::setLayout() устанавливает слой объекта MyWidget. При этом она является потомком MyWidget, потому мы можем не заботится о её удалении; данная связь гарантирует, что она будет удалена вместе с MyWidget. Также, при вызове QWidget::setLayout() наши виджеты автоматически становятся детьми MyWidget. Потому мы не устанавливали this в качестве предка для quit, lcd и slider.

В Qt виджеты могут быть потомками других виджетов (например, this) или не иметь предков. Виджет может быть добавлен в слой с помощью added, в этом случае слой будет отвечать за расположение и размер виджета, но он никогда не может действовать в качестве непосредственного предка. То есть, конструктор QWidgetиспользует указатель на QWidget в качестве родителя, а QLayout не наследуется от QWidget.

[править] Запуск приложения

LCD отражает все значения, которые вы задаете с помощью ползунка. Обратите внимание, что при изменении размера окна изменяются размеры цифр на жидко-кристалическом индикаторе, но при этом размеры шрифта на кнопке не меняется (изменение шрифта на кнопке выглядело бы очень странным).

[править] Домашнее задание

Попробуйте изменить размерность(число отображаемых цифр) виджета lcd или измените режим отображения с помощью метода ( QLCDNumber::setMode()). Вы можете добавить четыре кнопки для изменения основания системы исчисления.

Попробуйте изменить размерность ползунка.

Может лучше воспользоваться виджетом QSpinBox вместо ползунка?

Попробуйте сделать выход из вашей программы, если задается значение LCD больше, чем он может отобразить.

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



Copyright © 2007 Trolltech Trademarks
Qt 4.3.2