![]() |
Модераторы: powerfox, ZeeLax |
![]() ![]() ![]() |
|
GrayCardinal |
|
||||||||||||||||||||||||||||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 18 Всего: 58 |
Введение в Qt4
Qt4 - платформа для разработки приложений под (практически) любые операционные системы. Платформа включает в себя : 1. Среду для разработки графического интерфейса. 2. Компилятор мета-объектов. 3. Набор классов для работы. Все, от списков до баз данных. Платформой Qt4 занимается Trolltech . Сайт компании : www.trolltech.com. Лозунг компании, как написано на главной странице сайта : "меньше кодируйте, больше создавайте" -- Среда для разработки графического интерфейса (designer-qt4 или просто designer, только убедитесь что у вас действительно четвертая версия) Среда представляет три основные части : 1. Главное меню (с практически нулевой загруженностью). 2. Окно с доступными стандартными (и не очень) "виджетами". 3. Окно с редактором свойств (виджетов). -- Создание графического интерфейса. Создание GUI сводится к перетаскиванию нужных элементов на виджет и их позиционированию. Хочу отметить, что по-умолчанию все виджеты не имеют каких-либо жестких размеров или координат нахождения в родительском окне. Вам совсем не надо считать координаты и "подгонять" элементы под размеры окон. Все элементы сами масштабируются, чтобы вписаться в размеры окна. Когда вы хотите задать порядок расположения виджетов, вы создаете контейнер (layout), одного из двух типов : горизонтальный бокс, вертикальный бокс, и табличный бокс. В этих контейнерах все виджеты будут располагаться горизонтально, вертикально и в фасеточной разметке соответственно. У каждого виджета есть свойство, позволяющее задавать контейнер, в котором будут размещаться дочерние виджеты. Т.е. если вы хотите разместить дочерние виджеты, вы создаете контейнер, добавляете в него виджеты, затем "прикручиваете" контейнер к нужному родительскому окну. Конечно, среда сделает это за вас... при помощи трех кнопок. После размещения элементов в родительском виджете, можно нажать : GTRL+1 - вы получите вертикальный бокс (QVBoxLayout). GTRL+2 - горизонтальный бокс (QHBoxLayout). CTRL+5 - фасеточная разметка (QGridLayout). CTRL+0 - среда уберет виджеты из контейнера. ПРИМЕЧАНИЕ: после того, как вы задали контейнер для виджета, вы не можете добавлять элементы вне контейнера. ПРИМЕЧАНИЕ: элементы можно объеденять во вспомогательные контейнеры, для этого следует их выделить (можно использовать выделение рамкой и кнопку Shift) Виджеты не делятся на типы. Все графические элементы - это виджеты. Можно объеденить группу элементов и сделать из них один виджет. Любой виджет можно "назвать" главным окном, и независимо отобразить. Вы можете, к примеру, сделать (кодом из 10 строк) десять виджетов-кнопок и отобразить каждый виджет. В результате получите на экране десять кнопок, не привязаных к какому-либо окну, но полностью функциональных. Все элементы зачастую дочерние непосредственно от виджета (QWidget). Вам достаточно знать (уметь прочитать в документации) основные свойства виджетов и пару-тройку свойств непосредственно нужного вам элемента. Все свойства доступны через "окно свойств". Смысл неизвестных свойств в большинстве случаев можно наглядно увидеть простым их изменением (при изменение свойства соответствующие изменения произойдут в окне редактора виджетов). Права на метод принадлежат вашему покорному слуге... Шутка. На первый взгляд среда разработки графического интерфейса имеет минимум функциональности. Право слово,не стоит расстраиваться по этому поводу. То, что редактор виджетов может только редактировать виджеты, это вполне нормально и где-то даже правильно. Однако это совсем не значит что это вся функциональность платформы Qt4. Среда сохраняет виджеты в файлы с расширением .ui в формате XML. Однако вам не стоит беспокоиться по этому поводу. В Qt4 есть грамотные средства которые позволяеют элементарно получить нужный вам Си++ код из файлов .ui. -- Простое кодирование виджетов. В частном случае шаблонная программа Qt4 на ОС Linux выглядит так :
Вместо UTF8, естественно, необходимо указать вашу кодировку (см. "echo $LANG", все что после точки). В данной программе создается один виджет, отображается на экран и управление передается Qt4 (app.exec ()). Чтобы контролировать виджет, создаются функции которые будут реагировать на сигналы или "события". Сигналы используются различными стандартными элементами, события используются когда вы создаете собственный виджет. Для создания дочерних виджетов и размещения их в родительском, создается один из контейнеров :
Конечно, могут использоваться все виды элементов и контейнеров. Так же вы можете делать и использовать свои виджеты. Среда редактирования виджетов Qt4 поддерживает самодельные виджеты, т.е. вы можете создать свой виджет и работать с ним в визуальном (наглядном) режиме в самой среде. -- Сборка. Для создания программы из исходного кода, в Qt4 достаточно выполнить следующие действия : 1. Создать qt-проект. 2. Создать Makefile проекта. 3. Непосредственно слинковать программу. Для первых двух пунктов (на начальном этапе) может использоваться программа qmake, для этого и предназначенная. $ qmake -project $ qmake ПРИМЕЧАНИЕ: Возможно, на вашей системе необходимо использовать суффикс (-qt4, т.е. qmake-qt4) Эти две команды создадут вам файл .pro с описанием нового проекта и Makefile для сборки, далее можно просто выполнить команду : $ make Все ! Бинарник, работающий на платформе Qt4 готов ! -- Использование файла .ui Как вы помните, это файлы, созданные средой designer из комплекта Qt4. Эти файлы можно использовать двумя способами : 1. Преобразовать в код Си++ 2. Использовать непосредственно. Если с первым все понятно, то второй требует пояснения. Так что начну как раз с него. Qt4 позволяет сразу отображать виджеты, записанные в XML формате (файлы .ui). При создании таких виджетов в среде, вы указываете имена для всех элементов, которые выносите на виджет. Эти имена записаны в результирующем файле .ui. Во премя выполнения вы можете отобразить виджет, а к его элементам обращаться при помощи специальной функции, которая вернет вам указатель на нужный элемент по его имени. Даже преобразование полученного указателя к нужному классу Qt4 берет на себя.
Приведенный выше код отобразит ваш виджет myform, который вы ранее сделали при помощи designer'а. Теперь получить контроль над [существующей] кнопкой, к примеру, с именем "pushButton_1" можно так :
-- Преобразование .ui -> Си++ код. Для этого существует специальная утилита - uic. Чтобы получить Си++ код, достаточно выполнить uic для нужного файла и перенаправить поток вывода в будущий файл-исходник. $ uic anywidget.ui >./ui_anywidget.h ПРИМЕЧАНИЕ: Начиная с четвертой версии, uic не поддерживает создание отдельных файлов для кода и файла заголовков. В означенном примере uic создаст код для создания вашего виджета anywidget.ui, завернутый в класс и namespace Ui. Все такие классы будут доступны из Ui::<имя класса>. Тут следует отметить, что классы, созданные uic, не являются дочерними от каких-либо других, в том числе QWidget или даже QObject. Для использования класса uic, можно либо создать виджет, который наследует QWidget и класс uic, либо создать объект данного класса и вызывать setupUi для каждого виджета, где вы хотите отобразить элементы. Первый способ (наследование) :
Отображение объекта :
Второй способ (setupUi) :
ПРИМЕЧАНИЕ : если вы захотите добавить сигналы либо слоты в MyWidget из первого примера, вам придется дополнительно запустить "moc" (см. ниже). Добавлено @ 04:37 -- Сигналы и слоты. Сигналы и слоты - расширение языка Си++, позволяющее объектам взаимодействовать между собой при помощи простых механизмов. Когда один объект хочет проинформировать другой о том, что в нем произошле какое-то событие, он посылает сигнал. Объект-получатель сигнала должен иметь слот, специальным образом оформленную функцию, подключенный к этому сигналу. Сигналы используются когда основная задача объекта (виджета, таймера...), является информирование о происшествии чего-либо. К одному слоту можно подключить любое количество сигналов, так же как и любой сигнал можно подключить к любому количеству слотов. Объявление слотов :
Объявление сигнала (часть код из QAbstractButton)
Здесь Q_SIGNALS - макрос эквивалентный "public signals:" Для подключения сигнала к слоту, используется нечто вроде :
Где первые два аргумента - объект и его сигнал, следующие - объект-получатель, и его слот. Заметьте, сигналы и слоты записываются в специальных макросах, с указанием списка типов аргументов. При несовпадении аргументов, или отсутствии сигнала/слота, Qt выведет предупреждающее сообщение во время выполнения, т.е. при запуске connect. На этапе компиляции правильность аргументов не проверяется. Использовать "connect" или "disconnect" вы можете непосредственно. Для объялвения слота же, необходимо произвести линковку вашего объекта при помощи компилятора мета-объектов "moc". Иначе Qt не найдет ваш слот во время выполнения программы, о чем и выдаст предупреждающее сообщение вроде :
Вы не должны пренебрежительно относиться к подобным сообщениям, ибо это практически такая же ошибка, что и "Segmentation Fault". Когда объект хочет послать сигнал, он использует "emit", к примеру так :
Где q - имя объекта, содержащего сигнал (его можно опускать, если используется текущий объект). По скорости обработки сигналов есть такие цифры (из официальной документации Qt). На процессоре 500МГц (за 1 с.) - 2,000,000 сигналов, подключенных к одному слоту, или 1,200,000 сигналов, подключенных к двум слотам. -- moc Компилятор мета-объектов. При объявлении мета объекта (все объекты, которые используют какое-либо расширение Qt), его необходимо специальным образом обработать. Скажем так :
Вы так же должны подключить файл moc_anywidget.cpp к вашему проекту и обновлять его при обновлении ui_anywidget.h (а фактически, при изменении anywidget.ui). Логичней, конечно, просто дописать в файл проекта .pro, слудующие переменные :
После изменения, естестественно, выполнить qmake, для получения обновления Makefile. ПРИМЕЧАНИЕ: Оффициальная документация Qt предполагает непосредственное перечисление файлов, вместо использования шаблона. При использовании шаблона со звездочкой, могут возникнуть "недоразумение", если вы выполните qmake, в месте, где уже есть скомпилированный файл .ui. Так что перед запуском qmake - выполняйте "make clean". С любовью из Сибири... Oleg aka GrayCardinal. graycardinalster dog gmail dot com |
||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 4 Всего: 207 |
GrayCardinal,
я смотрю ты всерьез за Qt взялся ![]() за старание лови + -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 18 Всего: 58 |
MAKCim,
Мило. |
|||
|
||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 20 Всего: 97 |
GrayCardinal, по qt4 есть классная книга, но пока только на английском. Это переработанное издание книги по qt3. Где-то на форуме был линк.
|
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 18 Всего: 58 |
powerfox,
По qt4 есть классная вещь. Называется - документация. Правда на английском ![]() |
|||
|
||||
Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: 3 Всего: 62 |
Смотрю САБЖ и радуюсь за сипипишников. Вам GUI писать на столько же просто, как и нам, жабистам.
![]() |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 18 Всего: 58 |
Ch0bits,
Да я сам в шоке. Особенно когда узнал что можно нативные проги делать под винду, прямо в лине. Причем с GUI и SQL. Сейчас пытаюсь техпроцесс наладить. Qt4/Linux -> Qt4/Win ![]() |
|||
|
||||
BobiKK |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 655 Регистрация: 1.12.2005 Где: Essen, Deutschlan d Репутация: 7 Всего: 16 |
Я бы даже сказал полегче ![]() P.S. Правда вот лицензия дорогова-та. |
|||
|
||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 20 Всего: 97 |
Согласен, но opensource версия есть и под винду, и под мак. |
|||
|
||||
BobiKK |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 655 Регистрация: 1.12.2005 Где: Essen, Deutschlan d Репутация: 7 Всего: 16 |
Понимаешь в чем проблема, у нас в фирме весь софт написан под венду. Мы бы с удовольствием начали постепенный переход на Линуксы, но для этого софт нужно переписать под что-то кроссплатформенное. QT приходит первым на ум. Только вот, открывать исходники наших программ и выкладывать их на сервере для свободного скачивания, имхо, идея не самая лучшая. А лицензия на разработку одноверменно под Linux/Win выйдет подороже, чем дальше продолжать писать под венду и закупать виндоусы.
|
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 18 Всего: 58 |
BobiKK,
Ё. Так пишите опенсорсный-для -себя код ![]() ![]() Добавлено @ 01:01 ЗЫ Я сам так делать буду ![]() Это сообщение отредактировал(а) GrayCardinal - 20.2.2007, 01:02 |
|||
|
||||
BobiKK |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 655 Регистрация: 1.12.2005 Где: Essen, Deutschlan d Репутация: 7 Всего: 16 |
Если я не ошибаюсь, то у них там есть 2 лицензии: Open Source и всё остальное. Open source подразумевает, что где-то исходники должны лежать в свободном доступе. Всё равно где, пускай никто адреса не знает. Это понятно.
А вот на счет никто не узнает... Один раз конкуренты инспекцию наслали ![]() |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 18 Всего: 58 |
BobiKK,
Ну, у вас-то, конечно, все сложнее ![]() |
|||
|
||||
nerezus |
|
||||||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
![]()
|
||||||
|
|||||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 18 Всего: 58 |
Ну, в принципе, мы к такому логическому заключению и пришли ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Linux/UNIX: Клуб юнуксоидов" | |
|
Что такое клуб юнуксоидов? Это место более свободного общения специалистов и любителей *NIX систем. Новичкам: Этот раздел предназначен в основном именно для общения а не решения проблем. Правила всего раздела Linux/UNIX сюда не распространяются, но здесь имеются свои правила:
Короче, по репе получите по полной программе ;-) Happy hacking! Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Клуб юнуксоидов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |