Template:I18n/Language Navigation Bar (zh CN)
| 教程系列 | Qt4 Ruby 教学 |
| 预备课程 | 教学 5 - Building Blocks |
| 下一课 | 教学 7 - One Thing Leads to Another |
| 深入阅读 | n/a |
Contents |
档案:
这个范例展示如何封装两个 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 为不同/随机值。