Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 06 (zh CN): Difference between revisions
Neverendingo (talk | contribs) m (Text replace - "<code ruby>" to "<syntaxhighlight lang="ruby">") |
m (AnneW moved page Development/Tutorials/Qt4 Ruby Tutorial/Chapter 06 (zh CN) to Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 06 (zh CN) without leaving a redirect: Obsolete) |
||
(One intermediate revision by one other user not shown) | |||
Line 66: | Line 66: | ||
widget = MyWidget.new() | widget = MyWidget.new() | ||
widget.show() | widget.show() | ||
</ | </syntaxhighlight> | ||
===一行一行的浏览=== | ===一行一行的浏览=== | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
class LCDRange < Qt::Widget | class LCDRange < Qt::Widget | ||
</ | </syntaxhighlight> | ||
'''<tt>LCDRange</tt>''' widget 是一个没有任何 API 的 widget。它只有一个建构子。这种 widget 并不是非常有用,所以稍后我们将会加入一些 API。 | '''<tt>LCDRange</tt>''' widget 是一个没有任何 API 的 widget。它只有一个建构子。这种 widget 并不是非常有用,所以稍后我们将会加入一些 API。 | ||
Line 90: | Line 90: | ||
setLayout(layout) | setLayout(layout) | ||
end | end | ||
</ | </syntaxhighlight> | ||
这是直接抄袭第5章的 '''<tt>MyWidget</tt>''' 建构子。唯一的差别是,拿掉了 <strong>Quit</strong> 按钮和重新命名这个类别。 | 这是直接抄袭第5章的 '''<tt>MyWidget</tt>''' 建构子。唯一的差别是,拿掉了 <strong>Quit</strong> 按钮和重新命名这个类别。 | ||
Line 96: | Line 96: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
class MyWidget < Qt::Widget | class MyWidget < Qt::Widget | ||
</ | </syntaxhighlight> | ||
'''<tt>MyWidget</tt>''' 同样除了一个建构子外,没有其他 API。 | '''<tt>MyWidget</tt>''' 同样除了一个建构子外,没有其他 API。 | ||
Line 106: | Line 106: | ||
quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold)) | quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold)) | ||
connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()')) | connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()')) | ||
</ | </syntaxhighlight> | ||
这个过去在改名为 '''<tt>LCDRange</tt>''' 类别里的按钮,被分离出来。这样我们能有一个 <strong>Quit</strong> 按钮,和许多 '''<tt>LCDRange</tt>''' 对象。 | 这个过去在改名为 '''<tt>LCDRange</tt>''' 类别里的按钮,被分离出来。这样我们能有一个 <strong>Quit</strong> 按钮,和许多 '''<tt>LCDRange</tt>''' 对象。 | ||
Line 112: | Line 112: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
grid = Qt::GridLayout.new() | grid = Qt::GridLayout.new() | ||
</ | </syntaxhighlight> | ||
我们在 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] 中建立一个包含三行(column)的 [http://doc.qt.nokia.com/latest/qgridlayout.html Qt::GridLayout]。 | 我们在 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] 中建立一个包含三行(column)的 [http://doc.qt.nokia.com/latest/qgridlayout.html Qt::GridLayout]。 | ||
Line 124: | Line 124: | ||
end | end | ||
end | end | ||
</ | </syntaxhighlight> | ||
所有我们建立的9个 '''<tt>LCDRange</tt>''' widget,它们都是网格物件的子 widget。我们排列他们成3列3行。 | 所有我们建立的9个 '''<tt>LCDRange</tt>''' widget,它们都是网格物件的子 widget。我们排列他们成3列3行。 |
Latest revision as of 15:43, 23 June 2013
Template:I18n/Language Navigation Bar (zh CN)
Template:TutorialBrowser (zh CN)
Building Blocks Galore!
档案:
概览
这个范例展示如何封装两个 widget 为一个新的组件,以及使用在多量 widget 时是多么容易。这是第一次,我们使用自定义的 widget 作为子 widget。
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()
一行一行的浏览
class LCDRange < Qt::Widget
LCDRange widget 是一个没有任何 API 的 widget。它只有一个建构子。这种 widget 并不是非常有用,所以稍后我们将会加入一些 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
这是直接抄袭第5章的 MyWidget 建构子。唯一的差别是,拿掉了 Quit 按钮和重新命名这个类别。
class MyWidget < Qt::Widget
MyWidget 同样除了一个建构子外,没有其他 API。
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 对象。
grid = Qt::GridLayout.new()
我们在 Qt::Widget 中建立一个包含三行(column)的 Qt::GridLayout。
Qt::GridLayout 会自动排列在其中 widget 的行和列。在 widget 加入布局时, 您可以指定行和列的数字,Qt::GridLayout 会填入他们到网格(grid)中。
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 为不同/随机值。