Разработка/Руководства/Введение в Qt4 на Ruby/Глава 5
Серия примеров | Введение в программирование на Qt®4 на языке Ruby |
Необходимо знать | Пример 4: Давайте создадим свой виджет |
Следующий пример | Пример 6: Больше кубиков! |
Литература | нет |
«Кубики»
Файлы:
Обзор
Этот пример показывает, как можно создать и соединить между собой несколько виджетом при помощи сигналов и слотов, а также как обрабатывать изменения размеров.
require 'Qt4'
class MyWidget < Qt::Widget
def initialize()
super()
quit = Qt::PushButton.new('Quit')
quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))
lcd = Qt::LCDNumber.new(2)
slider = Qt::Slider.new(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)'))
layout = Qt::VBoxLayout.new()
layout.addWidget(quit)
layout.addWidget(lcd)
layout.addWidget(slider)
setLayout(layout)
end
end
app = Qt::Application.new(ARGV)
widget = MyWidget.new()
widget.show()
app.exec()
Построчный обзор программы
lcd = Qt::LCDNumber.new(2)
lcd — это объект класса Qt::LCDNumber, то есть виджет, показывающий числа в стиле ЖК-дисплея. В нашем случае объект настраивается на показ двух цифр.
slider = Qt::Slider.new(Qt::Horizontal)
slider.setRange(0, 99)
slider.setValue(0)
Пользователь может использовать виджет Qt::Slider (ползунок) для изменения значения числа в определённом диапазоне. Здесь мы создаём горизонтальный ползунок, устанавливаем минимальное значение в 0, максимальное значение в 99, а исходное значение равно 0.
connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))
Здесь мы используем механизм сигналов и слотов для того, чтобы соединить сигнал ползунка QAbstractSlider::valueChanged() со слотом «ЖК-дисплея» display().
Как только значение, установленное ползунком, меняется, ползунок выдаёт новое значение путём выработки сигнала QAbstractSlider::valueChanged(). Поскольку этот сигнал подключён к слоту «ЖК-дисплея» QLCDNumber::display(), этот слот вызывается при каждой выработке сигнала. Ни ползунок, ни «ЖК-дисплей» не знают о существовании друг друга, это одна из идей компонентно-ориентированного программирования.
layout = Qt::VBoxLayout.new()
layout.addWidget(quit)
layout.addWidget(lcd)
layout.addWidget(slider)
setLayout(layout)
MyWidget теперь использует Qt::VBoxLayout (вертикальная компоновка виджетов) для управления геометрией дочерних объектов. Поэтому теперь не нужно задавать координаты каждого виджета, как это делалось в 4-й главе. Кроме того, при использовании компоновки дочерние виджеты автоматически меняют размеры при изменении размеров окна. Затем мы добавляем виджеты quit, lcd, and slider в объект компоновки с помощью метода Qt::BoxLayout::addWidget().
Метод Qt::Widget::setLayout() устанавливает объект компоновки для виджета. При этом объект компоновки (layout) становится дочерним виджетом виджета MyWidget, так что нам не нужно заботиться о его удалении, он будет удалён вместе с виджетом MyWidget. Кроме того, при вызове Qt::Widget::setLayout() виджеты из объекта компоновки автоматически становятся дочерними виджетами виджета MyWidget. Поэтому не нужно явно устанавливать self в качестве родительского виджета для виджетов quit, lcd и slider.
Виджеты в Qt либо являются дочерними по отношению к другим виджетам, либо не имеют родительского виджета. Виджет можно добавить в компоновку, в этом случае объект компоновки становится ответственным за управление геометрией виджета, но компоновка не может выступать в качестве родительского виджета. Действительно, конструктор класса Qt::Widget принимает в качестве аргумента объект класса Qt::Widget (прим. пер.: в C++ соответствующий аргумент является указателем на QWidget), но класс Qt::Layout не является производным от класса Qt::Widget.
Запуск приложения
Число на «ЖК-дисплее» отражает положение ползунка, виджеты умеют менять размеры. Обратите внимание на то, что «ЖК-дисплей» меняет размеры при изменении размеров окна, но остальные виджеты не меняют своей высоты, иначе они бы выглядели некрасиво.
Упражнения
Попробуйте изменить параметры «ЖК-дисплея», чтобы он показывал больше цифр, или поменяйте систему счисления (Qt::LCDNumber::setMode()). Можно даже добавить 4 кнопки для выбора системы счисления.
Также можно поменять диапазон значений ползунка.
Иногда вместо ползунка удобнее использовать Qt::SpinBox.
Попробуйте сделать так, чтобы приложение закрывалось при переполнении числа на «ЖК-дисплее».