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

From KDE TechBase
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Template:I18n/Language Navigation Bar (zh CN)

Template:TutorialBrowser (zh CN)

Let There Be Widgets

档案:

概览

这个范例展示如何建立自己的 widget,并说明如何控制 widget 的最小和最大尺寸。

require 'Qt4'

class MyWidget < Qt::Widget
  def initialize(parent = nil)
    super
    setFixedSize(200, 120)

    quit = Qt::PushButton.new(tr('Quit'), self)
    quit.setGeometry(62, 40, 75, 30)
    quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))

    connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))
  end
end

app = Qt::Application.new(ARGV)

widget = MyWidget.new()
widget.show()

app.exec()

一行一行的浏览

class MyWidget < Qt::Widget

在这里,我们建立一个新的类别。因为这个类别继承自 Qt::Widget,所以新的类别是一个 widget,并且可以是一个最上层窗口或子 widget(就像前面章节的 Qt::PushButton)。

def initialize(parent = nil)
  super

这个类别只有一个成员,建构子(除了继承自 Qt::Widget 的成员)。这个建构子(constructor)是一个标准的 Qt widget 建构子,当您建立 widget 时,你应该包含一个类似的建构子。

这个参数是它的父 widget。为了建立一个最上层窗口,您要指定父 widget 为 nil 。正如你所看到的,这个 widget 预设为是一个最上层窗口。

就像大多数的 widget,它只是传递 parent 参数到 Qt::Widget 建构子。(如果你是 Ruby 的新手,不带任何参数呼叫 super 将自动传递任何目前方法接收的参数,到父类别的相同名称方法。更新:显然,不使用括号也是很重要,super() 将呼叫父类别的相同名称方法与一个空参数列表。)

setFixedSize(200, 120)

因为这个 widget 不知道如何处理大小改变,我们要固定它的大小。在下一章中,我们将展示一个可以响应使用者的大小改变事件的 widget。

quit = Qt::PushButton.new(tr('Quit'), self)
quit.setGeometry(62, 40, 75, 30)
quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))

在这里,我们建立并设定这个 widget 的子 widget (新 widget 的父 widget 是 self,即 MyWidget实例)。

QObject::tr() 函数调用围住的 'Quit' 字符串,标记该字符串是可以翻译的。从而在执行期(run-time)时,根据翻译档案的内容改变它。在决定以后要把您的应用程序翻译成其它语言的情况下,使用 QObject::tr() 围住所有用户可见的字符串是一个好习惯。

Qt::Widget::setGeometry() 呼叫设定两个 widget 的屏幕位置和大小。这等同于呼叫 Qt::Widget::move() 跟者用 Qt::Widget::resize()

    connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))

$qApp 指标是一个在 require 'Qt' 时,建立的全局(global)变量。它指向应用程序唯一的 Qt::Application 实例。

app = Qt::Application.new(ARGV)

widget = MyWidget.new()
widget.show()

app.exec()

在这里,我们实例化的新的子 widget、设定为主 widget,以及执行应用程序。

执行应用程序

这支程序的行为非常类似前一章的。不同之处在于我们如何实作它。但是,它的表现还是略有不同。只要尝试重设大小就会发现。

练习

尝试建立另一个 MyWidget 对象。会发生什么事?

尝试加入更多的按钮或把 Qt::PushButton 以外的东西放入 widget。