Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04 (zh TW): Difference between revisions
No edit summary |
No edit summary |
||
Line 9: | Line 9: | ||
pre=[[Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_3_(zh_TW)|教學 3 - Family Values]]| | pre=[[Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_3_(zh_TW)|教學 3 - Family Values]]| | ||
next=[[Development/Tutorials/Qt4_Ruby_Tutorial/ | next=[[Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_05_(zh_TW)|教學 5 - Building Blocks]] | ||
}} | }} | ||
== Let There Be Widgets == | == Let There Be Widgets == | ||
Line 59: | Line 59: | ||
這個參數是它的父 widget。為了建立一個最上層視窗,您要指定父 widget 為 '''<tt>nil</tt>''' 。正如你所看到的,這個 widget 預設為是一個最上層視窗。 | 這個參數是它的父 widget。為了建立一個最上層視窗,您要指定父 widget 為 '''<tt>nil</tt>''' 。正如你所看到的,這個 widget 預設為是一個最上層視窗。 | ||
就像大多數的 widget,它只是傳遞 '''<tt>parent</tt>''' 參數到 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] 建構子。( | 就像大多數的 widget,它只是傳遞 '''<tt>parent</tt>''' 參數到 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] 建構子。(如果你是 Ruby 的新手,不帶任何參數呼叫 '''<tt>super</tt>''' 將自動傳遞任何目前方法接收的參數,到父類別的相同名稱方法。''更新'':顯然,不使用括號也是很重要,'''<tt>super()</tt>''' 將呼叫父類別的相同名稱方法與一個空參數列表。) | ||
<code ruby> | <code ruby> | ||
Line 65: | Line 65: | ||
</code> | </code> | ||
因為這個 widget 不知道如何處理大小改變,我們要固定它的大小。在下一章中,我們將展示一個可以回應使用者的大小改變事件的 widget。 | |||
<code ruby> | <code ruby> | ||
Line 73: | Line 73: | ||
</code> | </code> | ||
在這裡,我們建立並設定這個 widget 的子 widget (新 widget 的父 widget 是 '''<tt>self</tt>''',即 '''<tt>MyWidget</tt>'''實例)。 | |||
[http://doc.qt.nokia.com/latest/qobject.html#tr QObject::tr()] 函式呼叫圍住的 'Quit' 字串,標記該字串是可以翻譯的。從而在執行期(run-time)時,根據翻譯檔案的內容改變它。在決定以後要把您的應用程式翻譯成其它語言的情況下,使用 [http://doc.qt.nokia.com/latest/qobject.html#tr QObject::tr()] 圍住所有使用者可見的字串是一個好習慣。 | |||
[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()]。 | |||
<code ruby> | <code ruby> | ||
Line 83: | Line 83: | ||
</code> | </code> | ||
'''<tt>$qApp</tt>''' 指標是一個在 '''<tt>require 'Qt'</tt>''' 時,建立的全域(global)變數。它指向應用程式唯一的 [http://doc.qt.nokia.com/latest/qapplication.html Qt::Application] 實例。 | |||
<code ruby> | <code ruby> | ||
Line 94: | Line 94: | ||
</code> | </code> | ||
在這裡,我們實例化的新的子 widget、設定為主 widget,以及執行應用程式。 | |||
===執行應用程式=== | ===執行應用程式=== | ||
這支程式的行為非常類似前一章的。不同之處在於我們如何實作它。但是,它的表現還是略有不同。只要嘗試調整大小就會發現。 | |||
===練習=== | ===練習=== | ||
嘗試建立另一個 '''<tt>MyWidget</tt>''' 物件。會發生什麼事? | |||
嘗試加入更多的按鈕或把 [http://doc.qt.nokia.com/latest/qpushbutton.html Qt::PushButton] 以外的東西放入 widget。 |
Revision as of 16:10, 1 January 2010
Template:I18n/Language Navigation Bar (zh TW)
Template:TutorialBrowser (zh TW)
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。