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

From KDE TechBase
(Created page with "Метод [http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()] устанавливает объект компоновки для виджета. П...")
(Created page with "Виджеты в Qt либо являются дочерними по отношению к другим виджетам, либо не имеют родительского в...")
Line 89: Line 89:
Метод [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>'''.  
Метод [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 ===
=== Running the Application ===

Revision as of 17:30, 2 July 2011

Other languages:


Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05


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

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 (Qt::LCDNumber::setMode()). You can even add four push buttons to set the number base.

You can also change the slider's range.

Perhaps it would have been better to use Qt::SpinBox than a slider?

Try to make the application quit when the LCD number overflows.