На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Что такое QT и с чем его едят ? , Наконец-то я созрел для статьи:-))
    Естественно, из меня писатель как из бутылки молоток, так что уж простите, если увидети выдержки из какой-либо знакомой вам доселе не обессудте :-)))
    И огромное спасибо uj за оказанную помощь в разработке статьи!!! Респект :-=))
    И так... поехали!...

    1. Что такое QT?
    =================
    Qt -- это кроссплатформенная библиотека, целью которой является вытеснение нативных API из ваших
    программ. Сейчас Qt -- это огромный объектно-ориентированный комбайн, в большинстве случаев
    позволяющий обойтись без привлечения каких-либо иных библиотек.
    В первую очередь Qt -- отличное средство для создания графического пользовательского
    интерфейса (GUI). В состав Qt входит дизайнер, позволяющий легко создавать графические интерфейсы
    для вашего приложения.
    Вам не придется заботиться о написании файлов сборки для каждой из платформ, за вас это сделают Qt.
    Достаточно просто написать файл проекта, в который внести все используемые файлы, и файл
    сборки можно будет создать одним вызовом утилиты qmake (естественно, под управлением целевой
    платформы). От себя добавлю, что иногда этот файл приходится править руками (а как же).
    О значимости данной библиотеки говорит хотя бы то, что она используется в таких успешных проектах,
    как Borland C++ Builder 6 и Opera.

    2. Где достать?
    ================
    Библиотека поставляется по нескольким лицензиям, одни из которых -- платные, другие -- нет. Под
    оконную систему X11 всегда можно с сайта www.trolltech.com легально
    взять GPL-версию Qt (и использовать, естественно, только
    в некоммерческих проектах). С системой Windows дело обстоит сложнее, поскольку, по мнению верхушки
    TrollTech, эта система не является ареной OpenSource-разработки. Последняя бесплатная версия для
    Windows -- 2.3.0. Но для находчивых людей это не проблема, есть сеть eDonkey ;-) Текущей на данный
    момент является версия 3.3.1. В скором времени ожидается версия 4.

    3. Технические подробности
    =============================
    Изначало Qt "работало" на пользовательский интерфейс. И именно поэтому эта часть библиотеки наиболее
    используема и наиболее развита. Интересен подход к позиционированию виджетов (виджет -- элемент
    GUI, всё что рисуется на окошке, включая его само) -- система слоёв (layout) позволяет вам забыть об абсолютном позиционировании, как о страшном сне. Теперь класс Layout сам следит за тем, что вы делаете с, например, главным окном и позиционирует все внутренние виджеты вслед за изменением геометрии этого окошка.
    Центральной идеей Qt является сигнально-слотовый механизм, реализующий взаимосвязь между объектами.
    Этот механизм реализован посредством прекомпиляции, что позволяет использовать его без всяких
    ухищрений (если вы заинтересованы в Qt, прямо в данный момент забудьте о callback-вызовах ).
    Каждый Qt-объект (не только вызуальные элементы!) может генерировать некоторые сигналы, жестко
    зашитые в структуру его класса. Сигнал -- это функция, объявленная в специальной секции signals
    и не имеющая реализации ("тела") а только передаваемые аргументы. К сигналу объекта (заметьте, не класса) могут быть подключены слоты. Слот -- это всего лишь метод, также объявленный в специальных секциях "slots". Слоты
    могут быть доступными (секция "public slots"), защищенными ("protected slots") и
    скрытыми ("private slots"). При помощи специального метода connect слот подсоединяется к сигналу.
    Небольшой пример:
    ExpandedWrap disabled
       
        connect(myValueDetector, SIGNAL(ValueChange( Value a),
                myApplicationUpdater, SLOT(onValueChange( Value a ))));



    После чего при каждом "испускании" сигнала ValueChange объектом myValueDetector
    будет вызываться слот onValueChange объекта myApplicationUpdater.
    Плюсы -- к одному сигналу можно подключить несколько слотов.
    Минусы -- один слот нельзя использовать для нескольких сигналов (например, для обработки группы кнопок). Сравните с системой событий VCL/CLX -- там как раз всё наоборот. Рассмотрим небольшой пример использования сигнально-слотового механизма:
    ExpandedWrap disabled
       
      //то, что инициирует сигнал для изменения
      class aValueDetector:public QObject
      {
        Q_OBJECT // нужно для объявления сигналов и слотов
      public:
          aValueDetector( Value a );
      signals:
          ValueChange( Value a );
      }
      //то, что его сможет обработать
      class aApplicationUpdater:public QObject
      {
        Q_OBJECT
      public:
          aApplicationUpdater();
      public slots:
          onValueChange( Value a );
      }
      // то, что всем управляет
      class aApplication
      {
      public:
          aApplication()
      {
      //некоторый код
      ..................
      //а вот теперь самое главное
        connect(myValueDetector, SIGNAL(ValueChange( Value a )),
                myApplicationUpdater, SLOT(onValueChange( Value a ))));
      // причем, заметьте, один сигнал может вызывать и другой сигнал и иметь несколько коннектов
      // одновременно
      }
      protected:
          aValueDetector*      myValueDetector;
          aApplicationUpdater* myApplicationUpdater;
      }



    Как видите, код "немного" отличается от стандартного C++. Данный текст подаётся на вход мета-компилятора moc, который из него уже производит стандартный код C++, который затем компилируется любым компилятором. Moc отличает "свои", т.е. поддерживающие сигнально-слотовый механизм, классы от стандартных по ключевому слову Q_OBJECT в самом начале объявления класса.

    Перечислим основные достоинства ядра библиотеки Qt:
    * встроенная поддержка Unicode и локализации (очень хорошо и очень правильно реализованной, смею
    заметить). В Qt4 обещают новый механизм рендеринга шрифтов, поддерживающий Unicode.
    * мощные события и фильтры событий (событие - это что-то вроде универсального сигнала, который можно посылать любому виджету, распознавать и соотвествующим образом обрабатывать с помощью фильтров. Например нажатие различных клавиш)
    * многофункциональные управляемые интервалами таймеры которые делают возможным просто и быстро
    вставлять много разных заданий в управляемый событиями ГПИ.
    * иерархические и настраиваемые объектные деревья, организующие принадлежность объектов естественным
    образом.
    * защищенные указатели QGuardedPtr, которые автоматически принимают значение NULL при
    уничтожении соответствующего объекта, в отличие от обычных указателей в C++, которые в этом
    случае становятся "неопределенными указателями".
    * Удобная документация, доступная и на русском языке (ссылки к сожалению не знаю, но могу с удовольствием выслать по заявке).

    В состав ядра библиотеки входят как классы для построения GUI (например: метка, поле ввода, кнопка и
    т.п.), так и классы, предназначенные для организации различных струтур хранения данных (например,
    списковых), работы с файлами, сетевого взаимодействия и многого другого. Некоторые из этих
    возможностей реализованы в виде дополнительных модулей:
    * модуль Canvas, мощный инструмент для работы с двухмерной графикой. Он использует принцип
    структурирования графики, что, несомненно, будет полезно в программировании простых двухмерных
    игр и подобного рода вещах. Холст состоит из нескольких "элементов", каждый элемент представлен
    объектом. Поддерживается также ряд интересных возможностей, таких как collision-detection, перемещение(нет во фришных версиях под виндой :-((( )
    объектов с определенными скоростями по осям. Подробнее читаем по ссылке:
    Ссылка
    * модуль Network, обеспечивающий поддержку сети в приложениях.
    * модуль OpenGL, позволяющий работать с трехмерной графикой при помощи портабельной библиотеки
    OpenGL. Поддерживается с версии 2.3.2.
    * модуль SQL, реализующий доступ к базам данных из приложений Qt. Данный модуль разбит на три уровня:
    пользовательский (элементы интерфейса), программный (абстрактный доступ к базам данных) и уровень
    драйверов.
    * модуль Table, предоставляющий в ваше распоряжение сетку для отображения табличных данных. Сетка
    являет собой очень мощный и гибкий интерфейс, работать с которым -- одно удобольствие
    * модуль XML, использующий интерфейс SAX2 и реализацию DOM второго уровня.

    Это далеко не полный перечень возможностей Qt.

    3. Как написать простенькое приложение на QT?
    =================================================
    Напишем файлик main.cpp следующего содержания:
    ExpandedWrap disabled
       
      #include <qapplication.h>
      #include <qpushbutton.h>
      int main( int argc, char **argv )
      {
          QApplication a( argc, argv );          // ну понятно, что без аппликухи никуда :-)
          QPushButton hello( "Привет, Мир!", 0 ); // Создаём простенькую кнопочку
          hello.resize( 100, 30 );                // растягиваем её, можно при желании и на весь экран :-)
          a.setMainWidget( &hello );              // Делаем кнопку основным виджетом, это нужно для того, чтобы при закратии этой самой кнопки всё приложение завершило свою работу
          hello.show();                          // это чтобы нашу красоту все увидели :-)
          return a.exec();                        // и как говориться "Поехали" copyright by Y. Gagarin :-)
      }



    Теперь напишем файл проекта под это дело (simple.pro):
    ExpandedWrap disabled
       
      PROJECT                = simple
      TEMPLATE                = app
      CONFIG                  = qt warn_on debug
      SOURCES                = main.cpp
      TARGET                  = simple



    В командной строке наберем:
    ExpandedWrap disabled
       
      qmake simple.pro




    И теперь черед утилиты make: приложение готово Запускаем, наблюдаем окошко с кнопочкой.
    Сообщение отредактировано: Allender -
      В принципе ничо так написал, респект :) Но есть и недочеты. Во-первых, не "механизм называемый сигналы и слоты", а сигнально-слотовый механизм. Во-вторых, ты его сбивчиво как-то объяснил. Если хошь, я могу попробовать доработать статью и тебе послать куда-нибудь, а потом ты доработаешь и т.п. :) Плюс тебе :)
        Цитата uj @ 19.04.04, 22:45
        В принципе ничо так написал, респект :) Но есть и недочеты. Во-первых, не "механизм называемый сигналы и слоты", а сигнально-слотовый механизм. Во-вторых, ты его сбивчиво как-то объяснил. Если хошь, я могу попробовать доработать статью и тебе послать куда-нибудь, а потом ты доработаешь и т.п. :) Плюс тебе :)

        Конечно посылай, доработаю и конечно же твой копирайт поставлю :-))))
        Ведь со стороны оно в таких делах всегла виднее... :-)
        Сообщение отредактировано: Allender -
          ну, по привату ушло :)
            Цитата uj @ 20.04.04, 23:35
            ну, по привату ушло :)

            Про фильты дописал, только вот с ХML проблема...
              я подробнее описать XML не могу, поскольку работал с ним всего пару раз и в подробности DOM и SAX не углублялся.. Хотя, в доке написано, что поддерживает полностью DOM level 2 и SAX2 (в процессе разработки). Единственное что могу сказать про XML -- могли бы и удобное что-то сделать (окромя точной реализации DOM), а то через все эти QDomElement лазить, чтоб достать какую-то настройку, достаёт конкретно :(
                Цитата
                Теперь класс Layout сам за тем, что вы делаете с, например, главным окном и позиционирует все внутренние виджеты вслед за изменением геометрии этого окошка.

                Я так подозреваю что тут после "Теперь класс Layout сам" пропущено слово.. например "следит".. :)
                  Цитата Tuzik[KARAVAN
                  ,11.05.04, 10:44]
                  Цитата
                  Теперь класс Layout сам за тем, что вы делаете с, например, главным окном и позиционирует все внутренние виджеты вслед за изменением геометрии этого окошка.

                  Я так подозреваю что тут после "Теперь класс Layout сам" пропущено слово.. например "следит".. :)

                  Спасибо, уже исправил :-)))
                    и вот тут - "...вытеснение наивных API из ваших..."
                    наверное "нативных" имелось в виду, мелочь конечно
                      угу, очепятались :) Allender, исправляй :) Кстати, есть идея написания The-Not-So-Short-Tutorial-To-Qt (или перевода охвициального туториала). Кто что думает по этому поводу?
                        Было бы супер!:) Или какойнить туториал написания маленького проектика степ бай степ. Многие вопросы сами собой бы отпали в таком случае :)
                          ну там у них оффициальные туториалы вполне хорошие :) Только вопрос появился, туториал какой версии Qt лучше переводить? Потому что в ветке 3 туториалы совсем другие, новые, а в ветке 2 (последняя бесплатная версия под винду) -- старые :)

                          FAQP.S. "- а третью win-commercial версию достать можно?
                          - можно ;)"
                            3 версию переводить! Под линухои то валит:)
                              ок, попробую. Начну с первого туториала. Результаты, если что, выложу тут. Если кто хочет помочь и перевести другие туториалы -- you're welcome :)
                                Цитата uj @ 14.05.04, 22:31
                                угу, очепятались :) Allender, исправляй :) Кстати, есть идея написания The-Not-So-Short-Tutorial-To-Qt (или перевода охвициального туториала). Кто что думает по этому поводу?

                                Есть, исправлено :-))))

                                Кстати, uj, если уж ты решил заняться туториалом, может быть тогда мне OpenGL заняться?

                                Попробую написать, что-то вроде простенького GL-го вьювера для картинок с использованием QT ;-)))
                                Небольшой опыт в этом уже есть....

                                Как вам эта идея?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0384 ]   [ 15 queries used ]   [ Generated: 1.05.24, 21:03 GMT ]