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

From KDE TechBase
(Created page with "Виджеты в Qt либо являются дочерними по отношению к другим виджетам, либо не имеют родительского в...")
(Updating to match new version of source page)
 
(8 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/ru|
{{TutorialBrowser/ru|
Line 91: Line 91:
Виджеты в 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].  
Виджеты в 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.

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