| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Клуб юнуксоидов > Введение в Qt4 |
| Автор: GrayCardinal 15.2.2007, 04:33 | ||||||||||||||||||||||||||||
| Введение в 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 15.2.2007, 11:02 |
| GrayCardinal, я смотрю ты всерьез за Qt взялся за старание лови + |
| Автор: GrayCardinal 15.2.2007, 12:55 | ||
MAKCim,
Мило. |
| Автор: powerfox 15.2.2007, 13:48 |
| GrayCardinal, по qt4 есть классная книга, но пока только на английском. Это переработанное издание книги по qt3. Где-то на форуме был линк. |
| Автор: GrayCardinal 15.2.2007, 15:34 |
| powerfox, По qt4 есть классная вещь. Называется - документация. Правда на английском |
| Автор: Ch0bits 18.2.2007, 20:53 |
| Смотрю САБЖ и радуюсь за сипипишников. Вам GUI писать на столько же просто, как и нам, жабистам. |
| Автор: GrayCardinal 18.2.2007, 21:02 |
| Ch0bits, Да я сам в шоке. Особенно когда узнал что можно нативные проги делать под винду, прямо в лине. Причем с GUI и SQL. Сейчас пытаюсь техпроцесс наладить. Qt4/Linux -> Qt4/Win |
| Автор: BobiKK 19.2.2007, 21:50 | ||
Я бы даже сказал полегче P.S. Правда вот лицензия дорогова-та. |
| Автор: powerfox 19.2.2007, 22:37 |
Согласен, но opensource версия есть и под винду, и под мак. |
| Автор: BobiKK 20.2.2007, 00:03 |
| Понимаешь в чем проблема, у нас в фирме весь софт написан под венду. Мы бы с удовольствием начали постепенный переход на Линуксы, но для этого софт нужно переписать под что-то кроссплатформенное. QT приходит первым на ум. Только вот, открывать исходники наших программ и выкладывать их на сервере для свободного скачивания, имхо, идея не самая лучшая. А лицензия на разработку одноверменно под Linux/Win выйдет подороже, чем дальше продолжать писать под венду и закупать виндоусы. |
| Автор: GrayCardinal 20.2.2007, 00:59 |
| BobiKK, Ё. Так пишите опенсорсный-для -себя код Добавлено @ 01:01 ЗЫ Я сам так делать буду |
| Автор: BobiKK 20.2.2007, 22:48 |
| Если я не ошибаюсь, то у них там есть 2 лицензии: Open Source и всё остальное. Open source подразумевает, что где-то исходники должны лежать в свободном доступе. Всё равно где, пускай никто адреса не знает. Это понятно. А вот на счет никто не узнает... Один раз конкуренты инспекцию наслали |
| Автор: GrayCardinal 21.2.2007, 02:11 |
| BobiKK, Ну, у вас-то, конечно, все сложнее |
| Автор: nerezus 21.2.2007, 10:51 | ||||||
|
| Автор: GrayCardinal 21.2.2007, 17:55 | ||
Ну, в принципе, мы к такому логическому заключению и пришли |
| Автор: GrayCardinal 22.2.2007, 04:26 |
| Убедительно попрошу флеймить в тему .............. |
| Автор: Artemios 15.6.2007, 20:24 |
| Вот, начинаю развитие темы: http://forum.vingrad.ru/forum/act-ST/f-314/t-159421/unread-1.html только на Python-е. |
| Автор: bilbobagginz 16.6.2007, 00:38 | ||||
это не имеет значения. если ты пишешь код для себя, не распространяя его, напр. фирма IBM хочет сделать всем рабочим часики, которые будут им, рабочим в 15:30 выскакивать на дисплей и звонить и говорить "пора домой!" то это прикладное ПО, внутреннее, и его никто никому не обязан выкладывать. а вот если IBM захочет эти часики продавать, или даже бесплатно выдавать на скачку со своего внешнего сервера, вот тогда они будут должны быть добры и вивести код наружу. идентичный случай был с фирмой linksys, которые создали на линуксе роутеры, и не выложили исходники. на них наехали, и теперь, их роутеры самые удобные из бюджетных WRT54*. это насчет внутреннего ПО. а насчет внешнего, пардон, месячная з/п программиста - не менее пары тыс. баксов.
|
| Автор: powerfox 16.6.2007, 12:16 | ||
Кстати, у них для студентов скидка ~ 50%, где-то видел прайс. |
| Автор: nickless 16.6.2007, 15:06 |
И для маленьких фирм (мало дохода и народа) тоже, на странице с прайсами где-то мелким текстом написано. |
| Автор: keiman 4.8.2007, 19:50 | ||
| Интересно, грамотный и интересный постинг. Добавлено через 5 минут и 13 секунд
Очень полезное продолжение темы! Ждем продолжения. |
| Автор: JackYF 30.8.2007, 19:08 | ||
оппа, а я ищу... поделись по налаживанию техпроцесса. А то в созданной мной теме к чему-то хорошему мы так и не пришли... |
| Автор: powerfox 30.8.2007, 23:27 | ||
Что за техпроцесс? Код совместим - ребутитесь и собираете проект. |
| Автор: JackYF 30.8.2007, 23:37 |
это понятно |
| Автор: powerfox 31.8.2007, 00:26 | ||
В разделе программирования в nix недавно обсуждалось что-то похожее (или даже это). |
| Автор: JackYF 31.8.2007, 10:13 | ||
логично, я эту тему и создал там |
| Автор: powerfox 31.8.2007, 12:03 |
| Автор: CompWorm 7.7.2008, 23:18 |
| здравствуйте. я не давно начал знакомство с Qt да и линуксом)) у меня назрело несколько нубских вопросов: 1) при помощи чего, кроме Qt для линукса можно написать гуёвое приложение, не сломав мозг? то есть с графической объектно-ориентированной средой разработки. только что-нибудь актуальное, а не мёртвое, вроде Kylix ))) язык значения не имеет, но лучше си-подобный. 2) я немного запутался в понимании смысла Qt... это набор сишных библиотек, при помощи которых облегчается создание gui или это виртуальная машина, выполняющая байт-код приложения, которое без нее не функционирует, типа явы и .NET ? 3) ясно что конечный бинарник для вин, никс и мак свой... но если брать только линуксовый бинарник, он остается зависим от конкретной линукс-системы и, скажем, конкретной версии ядра, или он в принципе всегда останется самостоятельным и рабочим для любой линукс системы и любой версии ядра этой системы без необходимости его перекомпилирования? 4) возможно я видел что-то не то 5) этот вопрос вытекает из предыдущего - можно ли кулхацкерным методом собрать desktop edition из бесплатной? скорее всего от моей слабой эрудированности некоторые вопросы заданы глупо и некорректно, но уж как сумел. спасибо |
| Автор: JackYF 7.7.2008, 23:32 | ||||||
Если Qt для тебя - сломать мозг, то ничего не подойдёт - остальное, имхо, сложнее.
С++-ных, а так да. Никакой виртуальной машины.
Ничто не вечно под солнцем. Совместимость хорошая в обе стороны, но не идеальная. |
| Автор: CompWorm 8.7.2008, 09:25 |
| JackYF, спасибо за четкие ответы +. Qt мне моск пока не ломает, а очень даже нравится, просто интересуюсь альтернативами. пойду искать инфу по gtk2[+], wxWidgets, fltk, tcl/tk для ощего знакомства |
| Автор: Любитель 8.7.2008, 14:20 |
| Изучай лучше Qt, только 4-ую (!). Сеть, ОупенГЛ - всё есть и в OSE. Как вариант - PyQt. |
| Автор: CompWorm 8.7.2008, 16:13 |
| Любитель, хм... а что же тогда мешает писать коммерческое проприетарное ПО на OSE? ... только совесть |
| Автор: Любитель 8.7.2008, 16:31 |
| Лицензия ;) Добавлено через 43 секунды Функциональные отличия коммерческой редакции: ActiveQt (only Windows) и драйвера для некоторых коммерческих СУБД. |
| Автор: CompWorm 8.7.2008, 17:55 |
| ну что ж)) ждем новых статей по Qt... надеюсь тут скоро появится отдельная ветка по нему с большим количеством поклонников. по крайней мере меня Qt восхищает |
| Автор: CompWorm 8.7.2008, 18:13 |
| а БД победить можно, судя по http://ru.opensuse.org/QT_%D0%B8_%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85 статье |
| Автор: powerfox 8.7.2008, 20:42 |
http://trolltech.com ;) Добавлено через 28 секунд Что значит победить? |
| Автор: Любитель 9.7.2008, 12:04 | ||
http://forum.vingrad.ru/forum/c-c++QT-gtk-wxWidgets.html |
| Автор: m0ro 11.7.2008, 04:25 |
| http://www.crossplatform.ru/documentation/qtdoc4.3/index.php может, кому сгодится |
| Автор: GrayCardinal 23.4.2009, 10:47 |
| Хочу предупредить что с выходом в свет QTCreator'а, большая часть вышеописанного переходит в разряд "устарело". QTCreator теперь делает всю работу. QDevelop ещё жив, но, видимо, со следующими версиями креатора, умрет и он... |
| Автор: Peter 29.5.2009, 14:20 |
| Удивился, когда узнал, что Qt выпущена под LGPL. Залез на сайт, посмотрел. 1. Не увидел, есть ли разница в возможностях (наборе классов) коммерческой, GPL и LGPL версиях. 2. Про свободную версию пишут: Qt SDK for Windows (Based on MinGW. Does not support VS compiler.) Значит, на VS2005+ можно только с коммерческой работать? Добавлено через 2 минуты и 45 секунд Хотя в колонке ссылок на Qt libraries 4.5 for Windows есть ссылка на Qt Supported Platforms. Среди них Visual Studio 2003, 2005, 2008 под Windows XP/Vista. |