Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04 (zh CN): Difference between revisions
(Created page with '{{Template:I18n/Language Navigation Bar_(zh_CN)|Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04}} {{TutorialBrowser_(zh_CN)| series=[[Development/Tutorials/Qt4_Ruby_Tutorial...') |
m (AnneW moved page Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04 (zh CN) to Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04 (zh CN) without leaving a redirect: Obsolete) |
||
(4 intermediate revisions by 2 users not shown) | |||
Line 9: | Line 9: | ||
pre=[[Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_3_(zh_CN)|教学 3 - Family Values]]| | pre=[[Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_3_(zh_CN)|教学 3 - Family Values]]| | ||
next=[[Development/Tutorials/Qt4_Ruby_Tutorial/ | next=[[Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_05_(zh_CN)|教学 5 - Building Blocks]] | ||
}} | }} | ||
== Let There Be Widgets == | == Let There Be Widgets == | ||
Line 19: | Line 19: | ||
这个范例展示如何建立自己的 widget,并说明如何控制 widget 的最小和最大尺寸。 | 这个范例展示如何建立自己的 widget,并说明如何控制 widget 的最小和最大尺寸。 | ||
< | <syntaxhighlight lang="ruby"> | ||
require 'Qt4' | require 'Qt4' | ||
Line 41: | Line 41: | ||
app.exec() | app.exec() | ||
</ | </syntaxhighlight> | ||
===一行一行的浏览 === | ===一行一行的浏览 === | ||
< | <syntaxhighlight lang="ruby"> | ||
class MyWidget < Qt::Widget | class MyWidget < Qt::Widget | ||
</ | </syntaxhighlight> | ||
在这里,我们建立一个新的类别。因为这个类别继承自 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget],所以新的类别是一个 widget,并且可以是一个最上层窗口或子 widget(就像前面章节的 [http://doc.qt.nokia.com/latest/qpushbutton.html Qt::PushButton])。 | 在这里,我们建立一个新的类别。因为这个类别继承自 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget],所以新的类别是一个 widget,并且可以是一个最上层窗口或子 widget(就像前面章节的 [http://doc.qt.nokia.com/latest/qpushbutton.html Qt::PushButton])。 | ||
< | <syntaxhighlight lang="ruby"> | ||
def initialize(parent = nil) | def initialize(parent = nil) | ||
super | super | ||
</ | </syntaxhighlight> | ||
这个类别只有一个成员,建构子(除了继承自 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] 的成员)。这个建构子(constructor)是一个标准的 Qt widget 建构子,当您建立 widget 时,你应该包含一个类似的建构子。 | 这个类别只有一个成员,建构子(除了继承自 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] 的成员)。这个建构子(constructor)是一个标准的 Qt widget 建构子,当您建立 widget 时,你应该包含一个类似的建构子。 | ||
Line 61: | Line 61: | ||
就像大多数的 widget,它只是传递 '''<tt>parent</tt>''' 参数到 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] 建构子。(如果你是 Ruby 的新手,不带任何参数呼叫 '''<tt>super</tt>''' 将自动传递任何目前方法接收的参数,到父类别的相同名称方法。''更新'':显然,不使用括号也是很重要,'''<tt>super()</tt>''' 将呼叫父类别的相同名称方法与一个空参数列表。) | 就像大多数的 widget,它只是传递 '''<tt>parent</tt>''' 参数到 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] 建构子。(如果你是 Ruby 的新手,不带任何参数呼叫 '''<tt>super</tt>''' 将自动传递任何目前方法接收的参数,到父类别的相同名称方法。''更新'':显然,不使用括号也是很重要,'''<tt>super()</tt>''' 将呼叫父类别的相同名称方法与一个空参数列表。) | ||
< | <syntaxhighlight lang="ruby"> | ||
setFixedSize(200, 120) | setFixedSize(200, 120) | ||
</ | </syntaxhighlight> | ||
因为这个 widget 不知道如何处理大小改变,我们要固定它的大小。在下一章中,我们将展示一个可以响应使用者的大小改变事件的 widget。 | 因为这个 widget 不知道如何处理大小改变,我们要固定它的大小。在下一章中,我们将展示一个可以响应使用者的大小改变事件的 widget。 | ||
< | <syntaxhighlight lang="ruby"> | ||
quit = Qt::PushButton.new(tr('Quit'), self) | quit = Qt::PushButton.new(tr('Quit'), self) | ||
quit.setGeometry(62, 40, 75, 30) | quit.setGeometry(62, 40, 75, 30) | ||
quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold)) | quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold)) | ||
</ | </syntaxhighlight> | ||
在这里,我们建立并设定这个 widget 的子 widget (新 widget 的父 widget 是 '''<tt>self</tt>''',即 '''<tt>MyWidget</tt>'''实例)。 | 在这里,我们建立并设定这个 widget 的子 widget (新 widget 的父 widget 是 '''<tt>self</tt>''',即 '''<tt>MyWidget</tt>'''实例)。 | ||
Line 79: | Line 79: | ||
[http://doc.qt.nokia.com/latest/qwidget.html#geometry-prop Qt::Widget::setGeometry()] 呼叫设定两个 widget 的屏幕位置和大小。这等同于呼叫 [http://doc.qt.nokia.com/latest/qwidget.html#pos-prop Qt::Widget::move()] 跟者用 [http://doc.qt.nokia.com/latest/qwidget.html#size-prop Qt::Widget::resize()]。 | [http://doc.qt.nokia.com/latest/qwidget.html#geometry-prop Qt::Widget::setGeometry()] 呼叫设定两个 widget 的屏幕位置和大小。这等同于呼叫 [http://doc.qt.nokia.com/latest/qwidget.html#pos-prop Qt::Widget::move()] 跟者用 [http://doc.qt.nokia.com/latest/qwidget.html#size-prop Qt::Widget::resize()]。 | ||
< | <syntaxhighlight lang="ruby"> | ||
connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()')) | connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()')) | ||
</ | </syntaxhighlight> | ||
'''<tt>$qApp</tt>''' 指标是一个在 '''<tt>require 'Qt'</tt>''' 时,建立的全局(global)变量。它指向应用程序唯一的 [http://doc.qt.nokia.com/latest/qapplication.html Qt::Application] 实例。 | '''<tt>$qApp</tt>''' 指标是一个在 '''<tt>require 'Qt'</tt>''' 时,建立的全局(global)变量。它指向应用程序唯一的 [http://doc.qt.nokia.com/latest/qapplication.html Qt::Application] 实例。 | ||
< | <syntaxhighlight lang="ruby"> | ||
app = Qt::Application.new(ARGV) | app = Qt::Application.new(ARGV) | ||
Line 92: | Line 92: | ||
app.exec() | app.exec() | ||
</ | </syntaxhighlight> | ||
在这里,我们实例化的新的子 widget、设定为主 widget,以及执行应用程序。 | 在这里,我们实例化的新的子 widget、设定为主 widget,以及执行应用程序。 | ||
Line 103: | Line 103: | ||
尝试加入更多的按钮或把 [http://doc.qt.nokia.com/latest/qpushbutton.html Qt::PushButton] 以外的东西放入 widget。 | 尝试加入更多的按钮或把 [http://doc.qt.nokia.com/latest/qpushbutton.html Qt::PushButton] 以外的东西放入 widget。 | ||
[[Category:Ruby]] |
Latest revision as of 15:40, 23 June 2013
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。