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

From KDE TechBase
(Created page with "=== Запуск приложения ===")
(Created page with "Эта программа показывает, насколько просто одновременно использовать множество виджетов. Кажды...")
Line 130: Line 130:
=== Запуск приложения ===
=== Запуск приложения ===


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 ===
=== Exercises ===

Revision as of 17:38, 2 July 2011

Other languages:


Development/Tutorials/Qt4 Ruby Tutorial/Chapter 06


Больше кубиков!
Серия примеров   Введение в программирование на 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 столбца.

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

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

Exercises

Initialize each slider with a different/random value on startup.