Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05/ru: Difference between revisions
Aspotashev (talk | contribs) (Created page with "Разработка/Руководства/Введение в Qt4 на Ruby/Глава 5") |
(Updating to match new version of source page) |
||
(25 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
<languages /> | <languages /> | ||
{{TutorialBrowser| | |||
series=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial| | {{TutorialBrowser/ru| | ||
name= | series=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial|Введение в программирование на Qt<sup>®</sup>4 на языке Ruby]]| | ||
pre=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_04| | name=«Кубики»| | ||
next=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_06| | pre=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_04|Пример 4: Давайте создадим свой виджет]]| | ||
next=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_06|Пример 6: Больше кубиков!]] | |||
}} | }} | ||
== | == «Кубики» == | ||
[[Image:Qt4_Ruby_Tutorial_Screenshot_5.png|center]] | [[Image:Qt4_Ruby_Tutorial_Screenshot_5.png|center]] | ||
Файлы: | |||
* [http://www.darshancomputing.com/qt4-qtruby-tutorial/tutorial/t5/t5.rb t5.rb] | * [http://www.darshancomputing.com/qt4-qtruby-tutorial/tutorial/t5/t5.rb t5.rb] | ||
=== | === Обзор === | ||
Этот пример показывает, как можно создать и соединить между собой несколько виджетом при помощи сигналов и слотов, а также как обрабатывать изменения размеров. | |||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 54: | Line 54: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === Построчный обзор программы === | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
lcd = Qt::LCDNumber.new(2) | lcd = Qt::LCDNumber.new(2) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
'''<tt>lcd</tt>''' | '''<tt>lcd</tt>''' — это объект класса [http://doc.qt.nokia.com/latest/qlcdnumber.html Qt::LCDNumber], то есть виджет, показывающий числа в стиле ЖК-дисплея. В нашем случае объект настраивается на показ двух цифр. | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 67: | Line 67: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Пользователь может использовать виджет [http://doc.qt.nokia.com/latest/qslider.html Qt::Slider] (ползунок) для изменения значения числа в определённом диапазоне. Здесь мы создаём горизонтальный ползунок, устанавливаем минимальное значение в 0, максимальное значение в 99, а исходное значение равно 0. | |||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 73: | Line 73: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Здесь мы используем механизм [http://doc.qt.nokia.com/latest/signalsandslots.html сигналов и слотов] для того, чтобы соединить сигнал ползунка [http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] со слотом «ЖК-дисплея» '''<tt>display()</tt>'''. | |||
Как только значение, установленное ползунком, меняется, ползунок выдаёт новое значение путём выработки сигнала [http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()]. Поскольку этот сигнал подключён к слоту «ЖК-дисплея» [http://doc.qt.nokia.com/latest/qlcdnumber.html#intValue-prop QLCDNumber::display()], этот слот вызывается при каждой выработке сигнала. Ни ползунок, ни «ЖК-дисплей» не знают о существовании друг друга, это одна из идей компонентно-ориентированного программирования. | |||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 85: | Line 85: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
'''<tt>MyWidget</tt>''' | '''<tt>MyWidget</tt>''' теперь использует [http://doc.qt.nokia.com/latest/qvboxlayout.html Qt::VBoxLayout] (вертикальная компоновка виджетов) для управления геометрией дочерних объектов. Поэтому теперь не нужно задавать координаты каждого виджета, как это делалось в 4-й главе. Кроме того, при использовании компоновки дочерние виджеты автоматически меняют размеры при изменении размеров окна. Затем мы добавляем виджеты '''<tt>quit</tt>''', '''<tt>lcd</tt>''', and '''<tt>slider</tt>''' в объект компоновки с помощью метода [http://doc.qt.nokia.com/latest/qboxlayout.html#addWidget Qt::BoxLayout::addWidget()]. | ||
Метод [http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()] устанавливает объект компоновки для виджета. При этом объект компоновки (layout) становится дочерним виджетом виджета '''<tt>MyWidget</tt>''', так что нам не нужно заботиться о его удалении, он будет удалён вместе с виджетом '''<tt>MyWidget</tt>'''. Кроме того, при вызове [http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()] виджеты из объекта компоновки автоматически становятся дочерними виджетами виджета '''<tt>MyWidget</tt>'''. Поэтому не нужно явно устанавливать '''<tt>self</tt>''' в качестве родительского виджета для виджетов '''<tt>quit</tt>''', '''<tt>lcd</tt>''' и '''<tt>slider</tt>'''. | |||
Виджеты в Qt либо являются дочерними по отношению к другим виджетам, либо не имеют родительского виджета. Виджет можно ''добавить'' в компоновку, в этом случае объект компоновки становится ответственным за управление геометрией виджета, но компоновка не может выступать в качестве родительского виджета. Действительно, конструктор класса [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] принимает в качестве аргумента объект класса [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] (''прим. пер.:'' в C++ соответствующий аргумент является '''указателем''' на QWidget), но класс [http://doc.qt.nokia.com/latest/qlayout.html Qt::Layout] не является производным от класса [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget]. | |||
=== | === Запуск приложения === | ||
Число на «ЖК-дисплее» отражает положение ползунка, виджеты умеют менять размеры. Обратите внимание на то, что «ЖК-дисплей» меняет размеры при изменении размеров окна, но остальные виджеты не меняют своей высоты, иначе они бы выглядели некрасиво. | |||
=== | === Упражнения === | ||
Попробуйте изменить параметры «ЖК-дисплея», чтобы он показывал больше цифр, или поменяйте систему счисления ([http://doc.qt.nokia.com/latest/qlcdnumber.html#mode-prop Qt::LCDNumber::setMode()]). Можно даже добавить 4 кнопки для выбора системы счисления. | |||
Также можно поменять диапазон значений ползунка. | |||
Иногда вместо ползунка удобнее использовать [http://doc.qt.nokia.com/latest/qspinbox.html Qt::SpinBox]. | |||
Попробуйте сделать так, чтобы приложение закрывалось при переполнении числа на «ЖК-дисплее». | |||
[[Category:Ruby]] | [[Category:Ruby/ru]] |
Latest revision as of 14:18, 18 July 2012
Серия примеров | Введение в программирование на 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.
Попробуйте сделать так, чтобы приложение закрывалось при переполнении числа на «ЖК-дисплее».