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

    From KDE TechBase

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