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

    From KDE TechBase
    (Created page with "Пример 5: «Кубики»")
    (Updating to match new version of source page)
     
    (20 intermediate revisions by 2 users not shown)
    Line 1: Line 1:
    <languages />
    <languages />


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


    {{TutorialBrowser/ru|
    {{TutorialBrowser/ru|
    Line 7: Line 7:
    name=Больше кубиков!|
    name=Больше кубиков!|
    pre=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_05|Пример 5: «Кубики»]]|
    pre=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_05|Пример 5: «Кубики»]]|
    next=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_07|Tutorial 7 - One Thing Leads to Another]]
    next=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_07|Пример 7: Одно приводит к другому]]
    }}
    }}
    == Building Blocks Galore! ==
    == Больше кубиков! ==
    [[Image:Qt4_Ruby_Tutorial_Screenshot_6.png|center]]
    [[Image:Qt4_Ruby_Tutorial_Screenshot_6.png|center]]


    Files:
    Файлы:
    * [http://www.darshancomputing.com/qt4-qtruby-tutorial/tutorial/t6/t6.rb t6.rb]
    * [http://www.darshancomputing.com/qt4-qtruby-tutorial/tutorial/t6/t6.rb t6.rb]


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


    This example shows how to encapsulate two widgets into a new component and how easy it is to use many widgets. For the first time, we use a custom widget as a child widget.
    Этот пример показывает, как можно упаковать 2 виджета в новый компонент и как можно удобно работать с большим количеством виджетов.


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


    === Line by Line Walkthrough ===
    === Построчный обзор программы ===
    <syntaxhighlight lang="ruby">
    <syntaxhighlight lang="ruby">
    class LCDRange < Qt::Widget
    class LCDRange < Qt::Widget
    </syntaxhighlight>
    </syntaxhighlight>


    The '''<tt>LCDRange</tt>''' widget is a widget without any API. It just has a constructor. This sort of widget is not very useful, so we'll add some API later.  
    Виджет '''<tt>LCDRange</tt>''' не имеет никакого программного интерфейса (API). У него есть только конструктор. Такой виджет не очень полезен, поэтому позже мы добавим в него больше возможностей.  


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


    This is lifted straight from the '''<tt>MyWidget</tt>''' constructor in Chapter 5. The only differences are that the <strong>Quit</strong> button is left out and the class is renamed.  
    Этот код взят из конструктора класса '''<tt>MyWidget</tt>''' из [[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_05|5-й главы]]. Единственное отличие в том, что кнопка <strong>Quit</strong> была выброшена.  


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


    '''<tt>MyWidget</tt>''', too, contains no API except a constructor.  
    '''<tt>MyWidget</tt>''' также не имеет никакого программного интерфейса, не считая конструктора.  


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


    The push button that used to be in what is now '''<tt>LCDRange</tt>''' has been separated so that we can have one <strong>Quit</strong> button and many '''<tt>LCDRange</tt>''' objects.  
    Кнопка отделена от '''<tt>LCDRange</tt>''', чтобы можно было иметь одну кнопку и несколько объектов класса '''<tt>LCDRange</tt>'''.  


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


    We create a [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] with a [http://doc.qt.nokia.com/latest/qgridlayout.html Qt::GridLayout] that will contain three columns. The [http://doc.qt.nokia.com/latest/qgridlayout.html Qt::GridLayout] automatically arranges its widgets in rows and columns; you can specify the row and column numbers when adding widgets to the layout, and [http://doc.qt.nokia.com/latest/qgridlayout.html Qt::GridLayout] will fit them into the grid.  
    Мы создаём [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] с компоновкой [http://doc.qt.nokia.com/latest/qgridlayout.html Qt::GridLayout], состоящей из трех столбцов. [http://doc.qt.nokia.com/latest/qgridlayout.html Qt::GridLayout] автоматически выстраивает виджеты по прямоугольной сетке; при добавлении виджета можно выбрать номера строки и столбца.  


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


    We create nine '''<tt>LCDRange</tt>''' widgets, all of which are children of the grid object, and we arrange them in three rows and three columns.  
    Мы создаём 9 виджетов '''<tt>LCDRange</tt>''', все они заносятся в компоновку по сетке так, чтобы виджеты были расположены в 3 ряда и 3 столбца.  


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


    This program shows how easy it is to use many widgets at a time. Each one behaves like the slider and LCD number in the previous chapter. Again, the difference lies in the implementation.  
    Эта программа показывает, насколько просто одновременно использовать множество виджетов. Каждый из них ведёт себя как ползунок и ЖК-дисплей из предыдущей главы.  


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


    Initialize each slider with a different/random value on startup.
    Сделайте начальные положения ползунков различными (например, случайными).


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

    Latest revision as of 14:19, 18 July 2012

    Other languages:


    Больше кубиков!
    Серия примеров   Введение в программирование на Qt®4 на языке Ruby
    Необходимо знать   Пример 5: «Кубики»
    Следующий пример   Пример 7: Одно приводит к другому
    Литература   нет

    Больше кубиков!

    Файлы:

    Обзор

    Этот пример показывает, как можно упаковать 2 виджета в новый компонент и как можно удобно работать с большим количеством виджетов.

    require 'Qt4'
    
    class LCDRange < Qt::Widget
      def initialize(parent = nil)
        super()
        lcd = Qt::LCDNumber.new(2)
    
        slider = Qt::Slider.new(Qt::Horizontal)
        slider.setRange(0, 99)
        slider.setValue(0)
    
        connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))
    
        layout = Qt::VBoxLayout.new()
        layout.addWidget(lcd)
        layout.addWidget(slider)
        setLayout(layout)
      end
    end
    
    class MyWidget < Qt::Widget
      def initialize(parent = nil)
        super()
        quit = Qt::PushButton.new(tr('Quit'))
        quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))
        connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))
    
        grid = Qt::GridLayout.new()
        
        for row in 0..2
          for column in 0..2
            grid.addWidget(LCDRange.new(), row, column)
          end
        end
    
        layout = Qt::VBoxLayout.new()
        layout.addWidget(quit)
        layout.addLayout(grid)
        setLayout(layout)
      end
    end    
    
    app = Qt::Application.new(ARGV)
    
    widget = MyWidget.new()
    widget.show()
    
    app.exec()
    

    Построчный обзор программы

    class LCDRange < Qt::Widget
    

    Виджет LCDRange не имеет никакого программного интерфейса (API). У него есть только конструктор. Такой виджет не очень полезен, поэтому позже мы добавим в него больше возможностей.

    def initialize(parent = nil)
      super()
      lcd = Qt::LCDNumber.new(2)
      slider = Qt::Slider.new(Qt::Horizontal)
      slider.setRange(0, 99)
      slider.setValue(0)
    
      connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))
    
      layout = Qt::VBoxLayout.new()
      layout.addWidget(lcd)
      layout.addWidget(slider)
      setLayout(layout)
    end
    

    Этот код взят из конструктора класса MyWidget из 5-й главы. Единственное отличие в том, что кнопка Quit была выброшена.

    class MyWidget < Qt::Widget
    

    MyWidget также не имеет никакого программного интерфейса, не считая конструктора.

    def initialize(parent = nil)
      super()
      quit = Qt::PushButton.new(tr('Quit'))
      quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))
      connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))
    

    Кнопка отделена от LCDRange, чтобы можно было иметь одну кнопку и несколько объектов класса LCDRange.

        grid = Qt::GridLayout.new()
    

    Мы создаём Qt::Widget с компоновкой Qt::GridLayout, состоящей из трех столбцов. Qt::GridLayout автоматически выстраивает виджеты по прямоугольной сетке; при добавлении виджета можно выбрать номера строки и столбца.

    for row in 0..2
      for column in 0..2
        grid.addWidget(LCDRange.new(), row, column)
      end
    end
    

    Мы создаём 9 виджетов LCDRange, все они заносятся в компоновку по сетке так, чтобы виджеты были расположены в 3 ряда и 3 столбца.

    Запуск приложения

    Эта программа показывает, насколько просто одновременно использовать множество виджетов. Каждый из них ведёт себя как ползунок и ЖК-дисплей из предыдущей главы.

    Упражнения

    Сделайте начальные положения ползунков различными (например, случайными).