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

From KDE TechBase
(Updating to match new version of source page)
(Created page with "Этот пример показывает, как можно создать свой собственный виджет. Также здесь рассказывается, к...")
Line 21: Line 21:
</span>
</span>


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">

Revision as of 21:14, 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)

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

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. Что произойдет?

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