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

    From KDE TechBase
    (Created page with '{{Template:I18n/Language Navigation Bar_(zh_CN)|Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05}} {{TutorialBrowser_(zh_CN)| series=[[Development/Tutorials/Qt4_Ruby_Tutorial...')
     
    No edit summary
    Line 101: Line 101:


    尝试当 LCD number 溢出(overflow)时,使应用程序退出。
    尝试当 LCD number 溢出(overflow)时,使应用程序退出。
    [[Category:Ruby]]

    Revision as of 06:51, 30 January 2010

    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)时,使应用程序退出。