Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05/ru: Difference between revisions

From KDE TechBase
(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 />


{{Template:I18n/Language Navigation Bar|Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05}}


{{TutorialBrowser|
 
series=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial|Qt4 Ruby Tutorial]]|
{{TutorialBrowser/ru|
name=Building Blocks|
series=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial|Введение в программирование на Qt<sup>®</sup>4 на языке Ruby]]|
pre=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_04|Tutorial 4 - Let There Be Widget]]|
name=«Кубики»|
next=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_06|Tutorial 6 - Building Blocks Galore!]]
pre=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_04|Пример 4: Давайте создадим свой виджет]]|
next=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_06|Пример 6: Больше кубиков!]]
}}
}}


== Building Blocks ==
== «Кубики» ==
[[Image:Qt4_Ruby_Tutorial_Screenshot_5.png|center]]
[[Image:Qt4_Ruby_Tutorial_Screenshot_5.png|center]]


Files:
Файлы:
* [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]


=== Overview ===
=== Обзор ===


This example shows how to create and connect together several widgets by using signals and slots, and how to handle resizes.
Этот пример показывает, как можно создать и соединить между собой несколько виджетом при помощи сигналов и слотов, а также как обрабатывать изменения размеров.


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 54: Line 54:
</syntaxhighlight>
</syntaxhighlight>


=== Line by Line Walkthrough ===
=== Построчный обзор программы ===
<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
     lcd = Qt::LCDNumber.new(2)
     lcd = Qt::LCDNumber.new(2)
</syntaxhighlight>
</syntaxhighlight>


'''<tt>lcd</tt>''' is a [http://doc.qt.nokia.com/latest/qlcdnumber.html Qt::LCDNumber], a widget that displays numbers in an LCD-like fashion. This instance is set up to display two digits.  
'''<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>


The user can use the  [http://doc.qt.nokia.com/latest/qslider.html Qt::Slider] widget to adjust an integer value in a range. Here we create a horizontal one, set its minimum value to 0, its maximum value to 99, and its initial value to 0.  
Пользователь может использовать виджет [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>


Here we use the [http://doc.qt.nokia.com/latest/signalsandslots.html signals and slots] mechanism to connect the slider's  [http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] signal to the LCD number's display() slot.  
Здесь мы используем механизм [http://doc.qt.nokia.com/latest/signalsandslots.html сигналов и слотов] для того, чтобы соединить сигнал ползунка [http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] со слотом «ЖК-дисплея» '''<tt>display()</tt>'''.  


Whenever the slider's value changes it broadcasts the new value by emitting the [http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] signal. Because that signal is connected to the LCD number's [http://doc.qt.nokia.com/latest/qlcdnumber.html#intValue-prop QLCDNumber::display()] slot, the slot is called when the signal is broadcast. Neither of the objects knows about the other. This is essential in component programming.  
Как только значение, установленное ползунком, меняется, ползунок выдаёт новое значение путём выработки сигнала [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>''' now uses a [http://doc.qt.nokia.com/latest/qvboxlayout.html Qt::VBoxLayout] to manage the geometry of its child widgets. For that reason, we don't need to specify the screen coordinates for each widget like we did in Chapter 4. In addition, using a layout ensures that the child widgets are resized when the window is resized. Then we add the '''<tt>quit</tt>''', '''<tt>lcd</tt>''', and '''<tt>slider</tt>''' widgets to the layout using [http://doc.qt.nokia.com/latest/qboxlayout.html#addWidget Qt::BoxLayout::addWidget()].  
'''<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()].  


The [http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()] function installs the layout on '''<tt>MyWidget</tt>'''. This makes the layout a child widget of '''<tt>MyWidget</tt>''' so we don't have to worry about deleting it; it will be deleted together with '''<tt>MyWidget</tt>'''. Also, the call to [http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()] automatically reparents the widgets in the layout so that they are children of '''<tt>MyWidget</tt>'''. Because of this, we didn't need to specify '''<tt>self</tt>''' as the parent for the '''<tt>quit</tt>''', '''<tt>lcd</tt>''', and '''<tt>slider</tt>''' widgets.  
Метод [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>'''.  


In Qt, widgets are either children of other widgets (e.g. '''<tt>self</tt>'''), or they have no parent. A widget can be ''added'' to a layout, in which case the layout becomes responsible for managing the geometry of that widget, but the layout can never act as a parent itself. Indeed, [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget]'s constructor takes a [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] pointer for the parent, and [http://doc.qt.nokia.com/latest/qlayout.html Qt::Layout] doesn't inherit from [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget].  
Виджеты в 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].  


=== Running the Application ===
=== Запуск приложения ===


The LCD number reflects everything you do to the slider, and the widget handles resizing well. Notice that the LCD number widget changes in size when the window is resized (because it can), but the others stay about the same (because otherwise they would look strange).  
Число на «ЖК-дисплее» отражает положение ползунка, виджеты умеют менять размеры. Обратите внимание на то, что «ЖК-дисплей» меняет размеры при изменении размеров окна, но остальные виджеты не меняют своей высоты, иначе они бы выглядели некрасиво.  


=== Exercises ===
=== Упражнения ===


Try changing the LCD number to add more digits or to change mode ([http://doc.qt.nokia.com/latest/qlcdnumber.html#mode-prop Qt::LCDNumber::setMode()]). You can even add four push buttons to set the number base.  
Попробуйте изменить параметры «ЖК-дисплея», чтобы он показывал больше цифр, или поменяйте систему счисления ([http://doc.qt.nokia.com/latest/qlcdnumber.html#mode-prop Qt::LCDNumber::setMode()]). Можно даже добавить 4 кнопки для выбора системы счисления.  


You can also change the slider's range.  
Также можно поменять диапазон значений ползунка.  


Perhaps it would have been better to use [http://doc.qt.nokia.com/latest/qspinbox.html Qt::SpinBox] than a slider?
Иногда вместо ползунка удобнее использовать [http://doc.qt.nokia.com/latest/qspinbox.html Qt::SpinBox].


Try to make the application quit when the LCD number overflows.
Попробуйте сделать так, чтобы приложение закрывалось при переполнении числа на «ЖК-дисплее».


[[Category:Ruby]]
[[Category:Ruby/ru]]

Latest revision as of 14:18, 18 July 2012

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.

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