Разработка/Руководства/Введение в Qt4 на Ruby/Глава 5

From KDE TechBase
This page is a translated version of the page Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05 and the translation is 100% complete.
Other languages:


«Кубики»
Серия примеров   Введение в программирование на 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.

Попробуйте сделать так, чтобы приложение закрывалось при переполнении числа на «ЖК-дисплее».