Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.59.168] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Естественно, из меня писатель как из бутылки молоток, так что уж простите, если увидети выдержки из какой-либо знакомой вам доселе не обессудте :-)))
И огромное спасибо 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 слот подсоединяется к сигналу. Небольшой пример: connect(myValueDetector, SIGNAL(ValueChange( Value a), myApplicationUpdater, SLOT(onValueChange( Value a )))); После чего при каждом "испускании" сигнала ValueChange объектом myValueDetector будет вызываться слот onValueChange объекта myApplicationUpdater. Плюсы -- к одному сигналу можно подключить несколько слотов. Минусы -- один слот нельзя использовать для нескольких сигналов (например, для обработки группы кнопок). Сравните с системой событий VCL/CLX -- там как раз всё наоборот. Рассмотрим небольшой пример использования сигнально-слотового механизма: //то, что инициирует сигнал для изменения 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 следующего содержания: #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): PROJECT = simple TEMPLATE = app CONFIG = qt warn_on debug SOURCES = main.cpp TARGET = simple В командной строке наберем: qmake simple.pro И теперь черед утилиты make: приложение готово Запускаем, наблюдаем окошко с кнопочкой. |
Сообщ.
#2
,
|
|
|
В принципе ничо так написал, респект Но есть и недочеты. Во-первых, не "механизм называемый сигналы и слоты", а сигнально-слотовый механизм. Во-вторых, ты его сбивчиво как-то объяснил. Если хошь, я могу попробовать доработать статью и тебе послать куда-нибудь, а потом ты доработаешь и т.п. Плюс тебе
|
Сообщ.
#3
,
|
|
|
Цитата uj @ 19.04.04, 22:45 В принципе ничо так написал, респект Но есть и недочеты. Во-первых, не "механизм называемый сигналы и слоты", а сигнально-слотовый механизм. Во-вторых, ты его сбивчиво как-то объяснил. Если хошь, я могу попробовать доработать статью и тебе послать куда-нибудь, а потом ты доработаешь и т.п. Плюс тебе Конечно посылай, доработаю и конечно же твой копирайт поставлю :-)))) Ведь со стороны оно в таких делах всегла виднее... :-) |
Сообщ.
#4
,
|
|
|
ну, по привату ушло
|
Сообщ.
#5
,
|
|
|
Цитата uj @ 20.04.04, 23:35 ну, по привату ушло Про фильты дописал, только вот с ХML проблема... |
Сообщ.
#6
,
|
|
|
я подробнее описать XML не могу, поскольку работал с ним всего пару раз и в подробности DOM и SAX не углублялся.. Хотя, в доке написано, что поддерживает полностью DOM level 2 и SAX2 (в процессе разработки). Единственное что могу сказать про XML -- могли бы и удобное что-то сделать (окромя точной реализации DOM), а то через все эти QDomElement лазить, чтоб достать какую-то настройку, достаёт конкретно
|
Сообщ.
#7
,
|
|
|
Цитата Теперь класс Layout сам за тем, что вы делаете с, например, главным окном и позиционирует все внутренние виджеты вслед за изменением геометрии этого окошка. Я так подозреваю что тут после "Теперь класс Layout сам" пропущено слово.. например "следит".. |
Сообщ.
#8
,
|
|
|
Цитата Tuzik[KARAVAN ,11.05.04, 10:44] Цитата Теперь класс Layout сам за тем, что вы делаете с, например, главным окном и позиционирует все внутренние виджеты вслед за изменением геометрии этого окошка. Я так подозреваю что тут после "Теперь класс Layout сам" пропущено слово.. например "следит".. Спасибо, уже исправил :-))) |
Сообщ.
#9
,
|
|
|
и вот тут - "...вытеснение наивных API из ваших..."
наверное "нативных" имелось в виду, мелочь конечно |
Сообщ.
#10
,
|
|
|
угу, очепятались Allender, исправляй Кстати, есть идея написания The-Not-So-Short-Tutorial-To-Qt (или перевода охвициального туториала). Кто что думает по этому поводу?
|
Сообщ.
#11
,
|
|
|
Было бы супер!:) Или какойнить туториал написания маленького проектика степ бай степ. Многие вопросы сами собой бы отпали в таком случае
|
Сообщ.
#12
,
|
|
|
ну там у них оффициальные туториалы вполне хорошие Только вопрос появился, туториал какой версии Qt лучше переводить? Потому что в ветке 3 туториалы совсем другие, новые, а в ветке 2 (последняя бесплатная версия под винду) -- старые
FAQP.S. "- а третью win-commercial версию достать можно? - можно " |
Сообщ.
#13
,
|
|
|
3 версию переводить! Под линухои то валит:)
|
Сообщ.
#14
,
|
|
|
ок, попробую. Начну с первого туториала. Результаты, если что, выложу тут. Если кто хочет помочь и перевести другие туториалы -- you're welcome
|
Сообщ.
#15
,
|
|
|
Цитата uj @ 14.05.04, 22:31 угу, очепятались Allender, исправляй Кстати, есть идея написания The-Not-So-Short-Tutorial-To-Qt (или перевода охвициального туториала). Кто что думает по этому поводу? Есть, исправлено :-)))) Кстати, uj, если уж ты решил заняться туториалом, может быть тогда мне OpenGL заняться? Попробую написать, что-то вроде простенького GL-го вьювера для картинок с использованием QT ;-))) Небольшой опыт в этом уже есть.... Как вам эта идея? |