StupidBeauty
Read times:903Posted at:Thu Jan 23 16:50:32 2014
- no title specified

Qt®4的Ruby教程翻译:第5章:构建块,Chapter 5: Building Blocks

Screenshot: Building BlocksScreenshot: Building Blocks


文件:

概述

这个示例演示的是,如何创建多个部件,并且使用信号和信号槽将它们连接起来,以及如何处理尺寸改变事件。

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 指定为quitlcd slider 部件的亲代部件了。

在Qt中,各个部件要么是其它部件(例如:self)的子代部件,要么就不拥有亲代部件。一个部件可以被添加到一个布局中,在那种情况下,布局对象负责管理那个部件的几何属性,但是布局对象本身不会充当亲代部件的角色。事实上,Qt::Widget的构造函数中所需要的参数是亲代部件的Qt::Widget指针,而Qt::Layout是不继承Qt::Widget的。

运行程序

液晶显示器数字对象会反映出妳对滑动器所做的所有事,并且这个部件也会处理好尺寸改变事件。注意,当窗口改变大小时,液晶显示器数字部件也会跟着改变大小(因为它可以做到),但是其它部件仍然保持自己的尺寸(因为它们如果也跟着改变大小的话看起来会狠奇怪)。

练习

试着修改液晶显示器对象,以添加更多数位,或者改变它的模式(Qt::LCDNumber::setMode())。妳甚至还可以添加4个按钮,用于设置它使用的数制(number base)。

妳还可以改变滑动器的取值范围。

或许用Qt::SpinBox来代替滑动器会有更好的效果?

试着改变程序,当液晶显示器数字部件溢出时退出程序。

[下一篇: 6章 ]

未知美人

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands