Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 06 (zh CN)

From KDE TechBase
Revision as of 20:43, 29 June 2011 by Neverendingo (talk | contribs) (Text replace - "<code ruby>" to "<syntaxhighlight lang="ruby">")

Template:I18n/Language Navigation Bar (zh CN)

Template:TutorialBrowser (zh CN)

Building Blocks Galore!

档案:

概览

这个范例展示如何封装两个 widget 为一个新的组件,以及使用在多量 widget 时是多么容易。这是第一次,我们使用自定义的 widget 作为子 widget。

<syntaxhighlight lang="ruby"> 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()

一行一行的浏览

<syntaxhighlight lang="ruby"> class LCDRange < Qt::Widget

LCDRange widget 是一个没有任何 API 的 widget。它只有一个建构子。这种 widget 并不是非常有用,所以稍后我们将会加入一些 API。

<syntaxhighlight lang="ruby"> 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

这是直接抄袭第5章的 MyWidget 建构子。唯一的差别是,拿掉了 Quit 按钮和重新命名这个类别。

<syntaxhighlight lang="ruby"> class MyWidget < Qt::Widget

MyWidget 同样除了一个建构子外,没有其他 API。

<syntaxhighlight lang="ruby"> 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 类别里的按钮,被分离出来。这样我们能有一个 Quit 按钮,和许多 LCDRange 对象。

<syntaxhighlight lang="ruby">

   grid = Qt::GridLayout.new()

我们在 Qt::Widget 中建立一个包含三行(column)的 Qt::GridLayout

Qt::GridLayout 会自动排列在其中 widget 的行和列。在 widget 加入布局时, 您可以指定行和列的数字,Qt::GridLayout 会填入他们到网格(grid)中。

<syntaxhighlight lang="ruby"> for row in 0..2

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

end

所有我们建立的9个 LCDRange widget,它们都是网格物件的子 widget。我们排列他们成3列3行。

执行应用程序

这支程序展示如何能够非常容易地一次使用许多 widget。每个 widget 的行为都像是前一章的 slider 和 LCD number。同样的,不同之处在于实现。

练习

在启动时,初始化每一个 slider 为不同/随机值。