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

From KDE TechBase
(Created page with "Пример 3: Иерархия виджетов")
(Updating to match new version of source page)
 
(25 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<languages />
<languages />


{{Template:I18n/Language Navigation Bar|Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04}}


{{TutorialBrowser/ru|
{{TutorialBrowser/ru|
series=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial|Введение в программирование на Qt<sup>®</sup>4 на языке Ruby]]|
series=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial|Введение в программирование на Qt<sup>®</sup>4 на языке Ruby]]|
name=Let There Be Widgets|
name=Давайте создадим свой виджет|
pre=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_3|Пример 3: Иерархия виджетов]]|
pre=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_3|Пример 3: Иерархия виджетов]]|
next=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_05|Tutorial 5 - Building Blocks]]
next=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_05|Пример 5: «Кубики»]]
}}
}}


== Let There Be Widgets ==
== Давайте создадим свой виджет ==
[[Image:Qt4_Ruby_Tutorial_Screenshot_4.png|center]]
[[Image:Qt4_Ruby_Tutorial_Screenshot_4.png|center]]


Files:
Файлы:
* [http://www.darshancomputing.com/qt4-qtruby-tutorial/tutorial/t4/t4.rb t4.rb]
* [http://www.darshancomputing.com/qt4-qtruby-tutorial/tutorial/t4/t4.rb t4.rb]


=== Overview ===
=== Обзор ===
This example shows how to create your own widget, and describes how to control the minimum and maximum sizes of a widget.
 
Этот пример показывает, как можно создать свой собственный виджет. Также здесь рассказывается, как настроить максимальные и минимальные размеры виджета.


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 43: Line 43:
</syntaxhighlight>
</syntaxhighlight>


=== Line by Line Walkthrough ===
=== Построчный обзор программы ===
<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
class MyWidget < Qt::Widget
class MyWidget < Qt::Widget
</syntaxhighlight>
</syntaxhighlight>


Here we create a new class. Because this class inherits from [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget], the new class is a widget and may be a top-level window or a child widget (like the [http://doc.qt.nokia.com/latest/qpushbutton.html Qt::PushButton] in the previous chapter).  
Здесь мы создаём новый класс. Поскольку этот класс наследуется от класса [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget], новый класс является виджетом и может быть либо окном, либо дочерним виджетом (как [http://doc.qt.nokia.com/latest/qpushbutton.html Qt::PushButton] в предыдущей главе).  


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 55: Line 55:
</syntaxhighlight>
</syntaxhighlight>


This class has only one member, a constructor (in addition to the members it inherits from [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget]). The constructor is a standard Qt widget constructor; you should always include a similar constructor when you create widgets.  
Этот класс имеет всего лишь один член, а именно, конструктор (не считая членов класса, наследованных от класса [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget]). При создании своих виджетов всегда нужно добавлять в класс аналогичный конструктор.  


The argument is its parent widget. To create a top-level window you specify '''<tt>nil</tt>''' as the parent. As you can see, this widget defaults to be a top-level window.  
Аргумент конструктора — это родительский виджет. Чтобы создать окно, нужно в качестве аргумента '''<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">
Line 65: Line 65:
</syntaxhighlight>
</syntaxhighlight>


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.  
Поскольку виджет не знает, что делать при изменении размеров, мы фиксируем его размер. В следующей главе мы покажем, как виджет может реагировать на изменение размеров пользователем.  


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 73: Line 73:
</syntaxhighlight>
</syntaxhighlight>


Here we create and set up a child widget of this widget (the new widget's parent is '''<tt>self</tt>''', i.e. the '''<tt>MyWidget</tt>''' instance).  
Здесь мы создаём и настраиваем дочерний виджет нашего виджета (родительским виджетом нового виджета становится '''<tt>self</tt>''', т.е. объект класса '''<tt>MyWidget</tt>''').  


The [http://doc.qt.nokia.com/latest/qobject.html#tr 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 [http://doc.qt.nokia.com/latest/qobject.html#tr QObject::tr()] around all user-visible strings, in case you decide later to translate your application to other languages.  
Метод [http://doc.qt.nokia.com/latest/qobject.html#tr QObject::tr()], вызванный для строки 'Quit', помечает её как переводимую, что позволяет менять её в процессе выполнения программы исходя из файла перевода. Хорошей привычкой является вызов [http://doc.qt.nokia.com/latest/qobject.html#tr QObject::tr()] для всех строк, видимых пользователем, на случай, если вы захотите перевести своё приложение на различные языки.  


The [http://doc.qt.nokia.com/latest/qwidget.html#geometry-prop Qt::Widget::setGeometry()] call sets both the widget's screen position and the size. It is equivalent to calling [http://doc.qt.nokia.com/latest/qwidget.html#pos-prop Qt::Widget::move()] followed by [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()] устанавливает и положение виджета на экране, и его размер. Это эквивалентно паре вызовов [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">
<syntaxhighlight lang="ruby">
Line 83: Line 83:
</syntaxhighlight>
</syntaxhighlight>


The '''<tt>$qApp</tt>''' pointer is a global variable created when you '''<tt>require 'Qt'</tt>'''. It points to the application's unique [http://doc.qt.nokia.com/latest/qapplication.html Qt::Application] instance.
'''<tt>$qApp</tt>''' — это глобальная переменная, создаваемая при выполнении '''<tt>require 'Qt'</tt>'''. Она указывает на объект класса [http://doc.qt.nokia.com/latest/qapplication.html Qt::Application], созданный в данном приложении.


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 94: Line 94:
</syntaxhighlight>
</syntaxhighlight>


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 '''<tt>MyWidget</tt>''' object. What happens?  
Попробуйте создать ещё один объект класса '''<tt>MyWidget</tt>'''. Что произойдет?  


Try to add more buttons or put in widgets other than [http://doc.qt.nokia.com/latest/qpushbutton.html Qt::PushButton].
Попробуйте добавить больше кнопок или других виджетов.


[[Category:Ruby]]
[[Category:Ruby/ru]]

Latest revision as of 14:16, 18 July 2012

Other languages:


Давайте создадим свой виджет
Серия примеров   Введение в программирование на 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)

Поскольку виджет не знает, что делать при изменении размеров, мы фиксируем его размер. В следующей главе мы покажем, как виджет может реагировать на изменение размеров пользователем.

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

Здесь мы создаём и настраиваем дочерний виджет нашего виджета (родительским виджетом нового виджета становится self, т.е. объект класса MyWidget).

Метод QObject::tr(), вызванный для строки 'Quit', помечает её как переводимую, что позволяет менять её в процессе выполнения программы исходя из файла перевода. Хорошей привычкой является вызов QObject::tr() для всех строк, видимых пользователем, на случай, если вы захотите перевести своё приложение на различные языки.

Вызов Qt::Widget::setGeometry() устанавливает и положение виджета на экране, и его размер. Это эквивалентно паре вызовов Qt::Widget::move() и Qt::Widget::resize().

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

$qApp — это глобальная переменная, создаваемая при выполнении require 'Qt'. Она указывает на объект класса Qt::Application, созданный в данном приложении.

app = Qt::Application.new(ARGV)

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

app.exec()

Здесь мы создаём объект нашего нового класса, объявляем его главным виджетом и запускаем приложение.

Запуск приложения

Программа ведёт себя почти так же, как и предыдущая. Основное отличие в реализации. Однако, если вы попробуете изменить размер окна, то заметите еще одно отличие.

Упражнения

Попробуйте создать ещё один объект класса MyWidget. Что произойдет?

Попробуйте добавить больше кнопок или других виджетов.