Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04/ru: Difference between revisions

From KDE TechBase
(Created page with "Аргумент конструктора — это родительский виджет. Чтобы создать окно, нужно в качестве аргумента ...")
(Created page with "Как и большинство виджетов, наш виджет просто передаёт аргумент '''<tt>parent</tt>''' в конструктор класса...")
Line 59: Line 59:
Аргумент конструктора — это родительский виджет. Чтобы создать окно, нужно в качестве аргумента '''<tt>parent</tt>''' передать '''<tt>nil</tt>'''. Нетрудно видеть, что по умолчанию виджет становится окном (если не указать аргумент '''<tt>parent</tt>''').  
Аргумент конструктора — это родительский виджет. Чтобы создать окно, нужно в качестве аргумента '''<tt>parent</tt>''' передать '''<tt>nil</tt>'''. Нетрудно видеть, что по умолчанию виджет становится окном (если не указать аргумент '''<tt>parent</tt>''').  


Like most widgets, it just passes on the '''<tt>parent</tt>''' parameter to the [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] constructor. (If you're new to Ruby, calling '''<tt>super</tt>''' without any parameters will automatically pass on any parameters a method received to the superclass's method of the same name. ''Update'': Apparently, it's also important to leave off the parentheses — calling '''<tt>super()</tt>''' will call the superclass's method of the same name with an empty parameter list.)
Как и большинство виджетов, наш виджет просто передаёт аргумент '''<tt>parent</tt>''' в конструктор класса [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget]. (Если вы не очень знакомы с Ruby: вызов '''<tt>super</tt>''' без аргументов автоматически передаёт все полученные в конструкторе аргументы в конструктор базового класса. Важно, что '''<tt>super</tt>''' написан без скобок: '''<tt>super()</tt>''' вызовет конструктор базового класса без аргументов.)


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">

Revision as of 17:20, 2 July 2011

Other languages:


Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04


Давайте создадим свой виджет
Серия примеров   Введение в программирование на Qt®4 на языке Ruby
Необходимо знать   Пример 3: Иерархия виджетов
Следующий пример   Пример 5: «Кубики»
Литература   нет

Давайте создадим свой виджет

Файлы:

Обзор

Этот пример показывает, как можно создать свой собственный виджет. Также здесь рассказывается, как настроить максимальные и минимальные размеры виджета.

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, новый класс является виджетом и может быть либо окном, либо дочерним виджетом (как Qt::PushButton в предыдущей главе).

def initialize(parent = nil)
  super

Этот класс имеет всего лишь один член, а именно, конструктор (не считая членов класса, наследованных от класса Qt::Widget). При создании своих виджетов всегда нужно добавлять в класс аналогичный конструктор.

Аргумент конструктора — это родительский виджет. Чтобы создать окно, нужно в качестве аргумента parent передать nil. Нетрудно видеть, что по умолчанию виджет становится окном (если не указать аргумент parent).

Как и большинство виджетов, наш виджет просто передаёт аргумент parent в конструктор класса Qt::Widget. (Если вы не очень знакомы с Ruby: вызов super без аргументов автоматически передаёт все полученные в конструкторе аргументы в конструктор базового класса. Важно, что super написан без скобок: super() вызовет конструктор базового класса без аргументов.)

    setFixedSize(200, 120)

Because this widget doesn't know how to handle resizing, we fix its size. In the next chapter, we will show how a widget can respond to resize event from the user.

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

Here we create and set up a child widget of this widget (the new widget's parent is self, i.e. the MyWidget instance).

The QObject::tr() function call around the string literal 'Quit' marks the string for translation, making it possible to change it at run-time based on the contents of a translation file. It is a good habit to use QObject::tr() around all user-visible strings, in case you decide later to translate your application to other languages.

The Qt::Widget::setGeometry() call sets both the widget's screen position and the size. It is equivalent to calling Qt::Widget::move() followed by Qt::Widget::resize().

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

The $qApp pointer is a global variable created when you require 'Qt'. It points to the application's unique Qt::Application instance.

app = Qt::Application.new(ARGV)

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

app.exec()

Here we instantiate our new child, set it to be the main widget, and execute the application.

Running the Application

This program is very similar in behavior to the previous one. The difference lies in the way we have implemented it. It does behave slightly differently, however. Just try to resize it to see.

Exercises

Try to create another MyWidget object. What happens?

Try to add more buttons or put in widgets other than Qt::PushButton.