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

    From KDE TechBase
    (Created page with "'''<tt>MyWidget</tt>''' теперь использует [http://doc.qt.nokia.com/latest/qvboxlayout.html Qt::VBoxLayout] (вертикальная компоновка видж...")
    (Created page with "Метод [http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()] устанавливает объект компоновки для виджета. П...")
    Line 87: Line 87:
    '''<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()].  
    '''<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].  
    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].  

    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.

    In Qt, widgets are either children of other widgets (e.g. self), 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, Qt::Widget's constructor takes a Qt::Widget pointer for the parent, and Qt::Layout doesn't inherit from 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.