Archive:Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04 (zh TW): Difference between revisions

From KDE TechBase
No edit summary
 
(2 intermediate revisions by one other user not shown)
Line 19: Line 19:
這個範例展示如何建立自己的 widget,並說明如何控制 widget 的最小和最大尺寸。
這個範例展示如何建立自己的 widget,並說明如何控制 widget 的最小和最大尺寸。


<code ruby>
<syntaxhighlight lang="ruby">
require 'Qt4'
require 'Qt4'


Line 41: Line 41:


app.exec()
app.exec()
</code>
</syntaxhighlight>


===一行一行的瀏覽 ===
===一行一行的瀏覽 ===
<code ruby>
<syntaxhighlight lang="ruby">
class MyWidget < Qt::Widget
class MyWidget < Qt::Widget
</code>
</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])。


<code ruby>
<syntaxhighlight lang="ruby">
def initialize(parent = nil)
def initialize(parent = nil)
   super
   super
</code>
</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>''' 將呼叫父類別的相同名稱方法與一個空參數列表。)


<code ruby>
<syntaxhighlight lang="ruby">
setFixedSize(200, 120)
setFixedSize(200, 120)
</code>
</syntaxhighlight>


因為這個 widget 不知道如何處理大小改變,我們要固定它的大小。在下一章中,我們將展示一個可以回應使用者的大小改變事件的 widget。
因為這個 widget 不知道如何處理大小改變,我們要固定它的大小。在下一章中,我們將展示一個可以回應使用者的大小改變事件的 widget。


<code ruby>
<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))
</code>
</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()]。


<code ruby>
<syntaxhighlight lang="ruby">
connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))
connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))
</code>
</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] 實例。


<code ruby>
<syntaxhighlight lang="ruby">
app = Qt::Application.new(ARGV)
app = Qt::Application.new(ARGV)


Line 92: Line 92:


app.exec()
app.exec()
</code>
</syntaxhighlight>


在這裡,我們實例化的新的子 widget、設定為主 widget,以及執行應用程式。
在這裡,我們實例化的新的子 widget、設定為主 widget,以及執行應用程式。

Latest revision as of 15:37, 23 June 2013

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。