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

From KDE TechBase
No edit summary
m (Text replace - "<code ruby>" to "<syntaxhighlight lang="ruby">")
Line 19: Line 19:
这个范例展示如何建立数个 widget,并且使用讯号和槽连接它们在一起。以及如何处理重设大小。
这个范例展示如何建立数个 widget,并且使用讯号和槽连接它们在一起。以及如何处理重设大小。


<code ruby>
<syntaxhighlight lang="ruby">
require 'Qt4'
require 'Qt4'


Line 54: Line 54:


===一行一行的浏览===
===一行一行的浏览===
<code ruby>
<syntaxhighlight lang="ruby">
lcd = Qt::LCDNumber.new(2)
lcd = Qt::LCDNumber.new(2)
</code>
</code>
Line 60: Line 60:
'''<tt>lcd</tt>''' 是一个 [http://doc.qt.nokia.com/latest/qlcdnumber.html Qt::LCDNumber],以类似 LCD 方式显示数字的 widget。此实例设定为显示两位数。
'''<tt>lcd</tt>''' 是一个 [http://doc.qt.nokia.com/latest/qlcdnumber.html Qt::LCDNumber],以类似 LCD 方式显示数字的 widget。此实例设定为显示两位数。


<code ruby>
<syntaxhighlight lang="ruby">
slider = Qt::Slider.new(Qt::Horizontal)
slider = Qt::Slider.new(Qt::Horizontal)
slider.setRange(0, 99)
slider.setRange(0, 99)
Line 68: Line 68:
使用者可以使用[http://doc.qt.nokia.com/latest/qslider.html Qt::Slider] widget 在范围内调整整数值。在这里,我们建立水平的 [http://doc.qt.nokia.com/latest/qslider.html Qt::Slider],设定它的最小值为0、最大值为99,而初始值为0。
使用者可以使用[http://doc.qt.nokia.com/latest/qslider.html Qt::Slider] widget 在范围内调整整数值。在这里,我们建立水平的 [http://doc.qt.nokia.com/latest/qslider.html Qt::Slider],设定它的最小值为0、最大值为99,而初始值为0。


<code ruby>
<syntaxhighlight lang="ruby">
     connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))
     connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))
</code>
</code>
Line 76: Line 76:
每当 slider 的值变化时,它会藉由发出(emit)[http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] 讯号,传送新的值。因为这个讯号连接到 LCD number 的 [http://doc.qt.nokia.com/latest/qlcdnumber.html#intValue-prop QLCDNumber::display()] 槽,当讯号传送时,槽就会被呼叫。这两个对象彼此都不知道对方。这就是组件程序设计(component programming)的要素。
每当 slider 的值变化时,它会藉由发出(emit)[http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] 讯号,传送新的值。因为这个讯号连接到 LCD number 的 [http://doc.qt.nokia.com/latest/qlcdnumber.html#intValue-prop QLCDNumber::display()] 槽,当讯号传送时,槽就会被呼叫。这两个对象彼此都不知道对方。这就是组件程序设计(component programming)的要素。


<code ruby>
<syntaxhighlight lang="ruby">
layout = Qt::VBoxLayout.new()
layout = Qt::VBoxLayout.new()
layout.addWidget(quit)
layout.addWidget(quit)

Revision as of 20:43, 29 June 2011

Template:I18n/Language Navigation Bar (zh CN)

Template:TutorialBrowser (zh CN)

Building Blocks

档案:

概览

这个范例展示如何建立数个 widget,并且使用讯号和槽连接它们在一起。以及如何处理重设大小。

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

一行一行的浏览

<syntaxhighlight lang="ruby"> lcd = Qt::LCDNumber.new(2)

lcd 是一个 Qt::LCDNumber,以类似 LCD 方式显示数字的 widget。此实例设定为显示两位数。

<syntaxhighlight lang="ruby"> slider = Qt::Slider.new(Qt::Horizontal) slider.setRange(0, 99) slider.setValue(0)

使用者可以使用Qt::Slider widget 在范围内调整整数值。在这里,我们建立水平的 Qt::Slider,设定它的最小值为0、最大值为99,而初始值为0。

<syntaxhighlight lang="ruby">

   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)的要素。

<syntaxhighlight lang="ruby"> 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)时,使应用程序退出。