Development/Tutorials/Qt4 Ruby Tutorial/Chapter 04/ru: Difference between revisions
Aspotashev (talk | contribs) (Created page with "== Давайте создадим свой виджет ==") |
(Updating to match new version of source page) |
||
(23 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<languages /> | <languages /> | ||
{{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= | 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|Пример 5: «Кубики»]] | next=[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial/Chapter_05|Пример 5: «Кубики»]] | ||
Line 13: | Line 12: | ||
[[Image:Qt4_Ruby_Tutorial_Screenshot_4.png|center]] | [[Image:Qt4_Ruby_Tutorial_Screenshot_4.png|center]] | ||
Файлы: | |||
* [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] | ||
=== | === Обзор === | ||
Этот пример показывает, как можно создать свой собственный виджет. Также здесь рассказывается, как настроить максимальные и минимальные размеры виджета. | |||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 43: | Line 43: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === Построчный обзор программы === | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
class MyWidget < Qt::Widget | class MyWidget < Qt::Widget | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Здесь мы создаём новый класс. Поскольку этот класс наследуется от класса [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> | ||
Этот класс имеет всего лишь один член, а именно, конструктор (не считая членов класса, наследованных от класса [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget]). При создании своих виджетов всегда нужно добавлять в класс аналогичный конструктор. | |||
Аргумент конструктора — это родительский виджет. Чтобы создать окно, нужно в качестве аргумента '''<tt>parent</tt>''' передать '''<tt>nil</tt>'''. Нетрудно видеть, что по умолчанию виджет становится окном (если не указать аргумент '''<tt>parent</tt>'''). | |||
Как и большинство виджетов, наш виджет просто передаёт аргумент '''<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> | ||
Поскольку виджет не знает, что делать при изменении размеров, мы фиксируем его размер. В следующей главе мы покажем, как виджет может реагировать на изменение размеров пользователем. | |||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 73: | Line 73: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Здесь мы создаём и настраиваем дочерний виджет нашего виджета (родительским виджетом нового виджета становится '''<tt>self</tt>''', т.е. объект класса '''<tt>MyWidget</tt>'''). | |||
Метод [http://doc.qt.nokia.com/latest/qobject.html#tr QObject::tr()], вызванный для строки 'Quit', помечает её как переводимую, что позволяет менять её в процессе выполнения программы исходя из файла перевода. Хорошей привычкой является вызов [http://doc.qt.nokia.com/latest/qobject.html#tr QObject::tr()] для всех строк, видимых пользователем, на случай, если вы захотите перевести своё приложение на различные языки. | |||
Вызов [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> | ||
'''<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> | ||
Здесь мы создаём объект нашего нового класса, объявляем его главным виджетом и запускаем приложение. | |||
=== | === Запуск приложения === | ||
Программа ведёт себя почти так же, как и предыдущая. Основное отличие в реализации. Однако, если вы попробуете изменить размер окна, то заметите еще одно отличие. | |||
=== | === Упражнения === | ||
Попробуйте создать ещё один объект класса '''<tt>MyWidget</tt>'''. Что произойдет? | |||
Попробуйте добавить больше кнопок или других виджетов. | |||
[[Category:Ruby]] | [[Category:Ruby/ru]] |
Latest revision as of 14:16, 18 July 2012
Серия примеров | Введение в программирование на 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. Что произойдет?
Попробуйте добавить больше кнопок или других виджетов.