Разработка/Руководства/Введение в Qt4 на Ruby/Глава 4

    From KDE TechBase
    Revision as of 17:21, 2 July 2011 by Aspotashev (talk | contribs) (Created page with "Category:Ruby/ru")
    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. Что произойдет?

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