
Screenshot: Building Blocks
文件:
•. t5.rb
这个示例演示的是,如何创建多个部件,并且使用信号和信号槽将它们连接起来,以及如何处理尺寸改变事件。
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,这是一个以液晶屏风格显示数字的部件。这个实例被设置为显示两位数字。
slider = Qt::Slider.new(Qt::Horizontal)
slider.setRange(0, 99)
slider.setValue(0)
用户可以使用Qt::Slider部件来在一个范围内调整某个整数值。这里,我们创建一个水平的滑动器,将它的最小值设置成0,最大值设置成99,初始值设置成0。
connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))
这里,我们使用信号与信号槽机制来将滑动器的QAbstractSlider::valueChanged()信号连接到液晶显示器数字的display()信号槽。
每当滑动器的值发生改变时,它就会通过发射QAbstractSlider::valueChanged()信号来将新的值广播出去。因为那个信号被连接到液晶显示器的QLCDNumber::display()信号槽,所以,当该信号被广播时,那个信号槽就会被调用。这两个对象都不知道对方的存在。这一点对于组件式编程是非常重要的。
layout = Qt::VBoxLayout.new()
layout.addWidget(quit)
layout.addWidget(lcd)
layout.addWidget(slider)
setLayout(layout)
MyWidget现在是使用一个Qt::VBoxLayout来管理它的子代部件的几何属性。因为那个原因,我们不需要像第4章中那样为每个部件指定屏幕坐标。另外,使用布局可以确保当窗口被改变大小时,它的子代部件也跟着改变大小。然后我们使用 Qt::BoxLayout::addWidget() 来将 quit 、 lcd 和 slider 部件添加到布局中。
Qt::Widget::setLayout()函数会将布局安装到MyWidget 中去。这使得该布局对象成为MyWidget 的一个子代部件,这样,我们就不用费心删除它了;它会与MyWidget 一同被删除。同时,调用Qt::Widget::setLayout()的时候也会自动地改变布局对象中各个子代部件的亲代部件属性,于是,它们就变成了MyWidget 的子代部件了。因为这一点,我们就不需要将self 指定为quit、lcd 和slider 部件的亲代部件了。
在Qt中,各个部件要么是其它部件(例如:self)的子代部件,要么就不拥有亲代部件。一个部件可以被添加到一个布局中,在那种情况下,布局对象负责管理那个部件的几何属性,但是布局对象本身不会充当亲代部件的角色。事实上,Qt::Widget的构造函数中所需要的参数是亲代部件的Qt::Widget指针,而Qt::Layout是不继承Qt::Widget的。
液晶显示器数字对象会反映出妳对滑动器所做的所有事,并且这个部件也会处理好尺寸改变事件。注意,当窗口改变大小时,液晶显示器数字部件也会跟着改变大小(因为它可以做到),但是其它部件仍然保持自己的尺寸(因为它们如果也跟着改变大小的话看起来会狠奇怪)。
试着修改液晶显示器对象,以添加更多数位,或者改变它的模式(Qt::LCDNumber::setMode())。妳甚至还可以添加4个按钮,用于设置它使用的数制(number base)。
妳还可以改变滑动器的取值范围。
或许用Qt::SpinBox来代替滑动器会有更好的效果?
试着改变程序,当液晶显示器数字部件溢出时退出程序。
未知美人
HxLauncher: Launch Android applications by voice commands