Разработка/Руководства/Введение в Qt4 на Ruby/Глава 6

Jump to: navigation, search
This page is a translated version of a page Development/Tutorials/Qt4 Ruby Tutorial/Chapter 06 and the translation is 100% complete.

Other languages:English 100% • ‎Finnish 100% • ‎Russian 100%


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

Contents

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

Qt4 Ruby Tutorial Screenshot 6.png

Файлы:

Обзор

Этот пример показывает, как можно упаковать 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 столбца.

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

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

Упражнения

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


This page was last modified on 18 July 2012, at 15:19. This page has been accessed 1,822 times. Content is available under Creative Commons License SA 3.0 as well as the GNU Free Documentation License 1.2.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V.Legal