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

From KDE TechBase
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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() 加入quitlcd,和 slider widget 到布局中。

Qt::Widget::setLayout() 函式将这个布局安装在 MyWidget 中。这使得布局成为 MyWidget 的子 widget,所以不用担心删除它的问题,它会与 MyWidget 一起被删除。此外,呼叫 Qt::Widget::setLayout() 会自动重新设定布局中 widget 的父 widget,使他们成为 MyWidget 的子 widget。正因如此,我们不需要指定 selfquitlcd,和 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)时,使应用程序退出。