[Предыдущий: Урок 4] [Учебное пособие] [Следующий: Урок 6] Урок 5 - Строим блоки
Файлы: Следующий пример продемонстрирует нам, как создавать и объединять несколько виджетов, используя сигналы и слоты, а также как обрабатывать изменение размера окна пользователем. #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(). Первоначальный вариант примера Тетриса, который использует QLCDNumber, чтобы отображать очки, был тоже написан в то время. QSlider *slider = new QSlider(Qt::Horizontal); slider->setRange(0, 99); slider->setValue(0); Пользователь сможет корректировать целочисленное значение в определённом диапазоне с помощью виджета QSlider. В этих строчках мы создаем горизонтальный ползунок, устанавливаем его минимальное значение равным 0, максимальное значение - равным 99, а начальное значение - равным 0. connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); В этой строчке с помощью механизма сигналов и слотов мы соединяем сигнал valueChanged() со слотом виджета LCD display(). Каждый раз, когда мы изменяем положение ползунка, он испускает сигнал valueChanged() с новым значением. Поскольку мы соединили сигнал со слотом display(), он будет вызван при испускании сигнала. Эти виджеты не знают друг о друге. Эта независимость является основой компонентного программирования. Во всём остальном слоты являются обычными функциями-членами C++ и подчиняются обычным правилам получения доступа C++. 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) или вовсе не иметь предка. Виджет может быть добавлен в компоновку, в этом случае компоновка будет отвечать за управление расположением и размерами виджета, но компоновка сама по себе никогда не сможет выступать в качестве родительского виджета. В самом деле, конструктор QWidget принимает указатель на QWidget в качестве родителя, а QLayout не унаследован от QWidget. Запуск приложенияЖК-индикатор отражает все значения, которые вы задаете с помощью ползунка, а виджет обрабатывает изменение размеров. Обратите внимание, что при изменении размера окна (поскольку это разрешено) изменяются размеры и ЖК-индикатора, но при этом размеры шрифта на кнопке не меняется (изменение шрифта на кнопке выглядело бы очень странным). Домашнее заданиеПопробуйте добавить больше отображаемых цифр в ЖК-индикаторе или измените режим отображения (метод QLCDNumber::setMode()). Вы можете добавить четыре кнопки для изменения основания системы исчисления. Попробуйте также изменить диапазон значений ползунка. Возможно, лучше будет воспользоваться виджетом QSpinBox вместо ползунка? Попробуйте сделать выход из вашей программы, если задается значение ЖК-индикатора больше, чем он может отобразить. [Предыдущий: Урок 4] [Учебное пособие] [Следующий: Урок 6]
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |