Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05 (zh CN)
Template:I18n/Language Navigation Bar (zh CN)
Template:TutorialBrowser (zh CN)
Building Blocks
档案:
概览
这个范例展示如何建立数个 widget,并且使用讯号和槽连接它们在一起。以及如何处理重设大小。
require 'Qt4'
class MyWidget < Qt::Widget
def initialize()
super()
quit = Qt::PushButton.new('Quit')
quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))
lcd = Qt::LCDNumber.new(2)
slider = Qt::Slider.new(Qt::Horizontal)
slider.setRange(0, 99)
slider.setValue(0)
connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))
connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))
layout = Qt::VBoxLayout.new()
layout.addWidget(quit)
layout.addWidget(lcd)
layout.addWidget(slider)
setLayout(layout)
end
end
app = Qt::Application.new(ARGV)
widget = MyWidget.new()
widget.show()
app.exec()
一行一行的浏览
lcd = Qt::LCDNumber.new(2)
lcd 是一个 Qt::LCDNumber,以类似 LCD 方式显示数字的 widget。此实例设定为显示两位数。
slider = Qt::Slider.new(Qt::Horizontal)
slider.setRange(0, 99)
slider.setValue(0)
使用者可以使用Qt::Slider widget 在范围内调整整数值。在这里,我们建立水平的 Qt::Slider,设定它的最小值为0、最大值为99,而初始值为0。
connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))
这里我们使用讯号和槽机制连接 slider 的 QAbstractSlider::valueChanged() 讯号到 LCD number 的 display() 槽。
每当 slider 的值变化时,它会藉由发出(emit)QAbstractSlider::valueChanged() 讯号,传送新的值。因为这个讯号连接到 LCD number 的 QLCDNumber::display() 槽,当讯号传送时,槽就会被呼叫。这两个对象彼此都不知道对方。这就是组件程序设计(component programming)的要素。
layout = Qt::VBoxLayout.new()
layout.addWidget(quit)
layout.addWidget(lcd)
layout.addWidget(slider)
setLayout(layout)
MyWidget 现在使用 Qt::VBoxLayout 管理其子 widget 的几何形状。因为这个原因,我们不需要像第4章那样为每个widget 指定屏幕坐标。此外,使用布局(layout)确保当窗口大小改变时,其子 widget 会重设大小。然后我们使用 Qt::BoxLayout::addWidget() 加入quit、lcd,和 slider widget 到布局中。
Qt::Widget::setLayout() 函式将这个布局安装在 MyWidget 中。这使得布局成为 MyWidget 的子 widget,所以不用担心删除它的问题,它会与 MyWidget 一起被删除。此外,呼叫 Qt::Widget::setLayout() 会自动重新设定布局中 widget 的父 widget,使他们成为 MyWidget 的子 widget。正因如此,我们不需要指定 self 为 quit、lcd,和 slider widget 的父 widget。
在 Qt 中,widget 可以是其他 widget(如 self)的子 widget,或者他们没有父 widget。widget 可以被加入到一个布局,在这种情况下,布局负责管理 widget 的几何形状,但布局本身不能作为父 widget。事实上,Qt::Widget 的建构子使用一个 Qt::Widget 指标指向父 widget,而且 Qt::Layout 没有继承自 Qt::Widget 。
执行应用程序
LCD number 反映了你对 slider 做的一切,而且这个 widget 也成功处理大小变动。请注意,当窗口大小调整时,LCD number widget 大小也会变动(因为它可以),但其他保持不变(否则他们看起来会很奇怪)。
练习
尝试修改 LCD number ,增加更多位数或更改模式(Qt::LCDNumber::setMode())。您甚至可以增加四个按钮来设定基数(number base)。
您还可以更改 slider 的范围。
也许使用 Qt::SpinBox 比 slider 更好?
尝试当 LCD number 溢出(overflow)时,使应用程序退出。