Инструменты пользователя

Инструменты сайта



// Qt Creator Plugins Docs

По мотивам рассылки qt-creator@qt.nokia.com, подборка документации по написанию плагинов для Qt Creator'а:

Для примера можно поглядеть различные плагины на гиториусе: https://gitorious.org/search?q=qt+creator+plugins

Если будет появляться новая информация, буду дополнять пост.

// Image Ruler 0.98.1

Выпустил версию 0.98.1 программы Image Ruler для измерения на растровых изображениях.

Изменений минимум:

  • Добавлен вывод суммирующей длинны при измерении ломанной линией (столкнулся с расчётом маршрута по карте)
  • В win32 сборку добавлены плагины графических форматов: теперь из коробки открываются jpeg/gif и иже с ними, иначе работал только png.

// QAvr - графический интерфейс для работы с avrdude

Подготовил и выложил пилотную версию 0.1

Подробности: QAvr

В будущем планируется довести до состояние менеджера проекта для совместной работы с geany.

// Image Ruler 0.98

Image Ruler - небольшой приложение для измерений на сканированных изображениях, например картах.

По сути анонс, хотя версии были уже выложены.

Оформил страницу проекта и выложил в для скачивания версию 0.98, по сравнению с 0.0.3 изменения:

  • исправлена ошибка с расчетом DPI и получением его из изображения (невозможно было активировать)
  • косметика интерфейса, приведен к финальному виду.

К версии 1.00 думаю будет сделано следующее:

  • краткое руководство
  • измерение в единицах отличных от миллиметров
  • оптимизация получения мета-информации из изображения
  • перевод на CMake и добавление правил для установки (make install)
  • иконку :-) кстати, кто предложит, должна отображать суть - измерения.

// Cmake, Qt4 и кросс-компиляция

Есть у меня проектик, он как тестовый полигон, хоть код и достаточно в большом количестве поддается только одной характеристике: исторически сложилось. Но на нем первом я опробовал кросс-компиляцию для Windows из Linux. Теперь его же перевел в обучающих целях на Cmake. Однако, все новое не должно отменять старых достижений, как следствие встал вопрос - а как теперь делать сборку для Windows?

С учетом того, что система сама по себе пока малознакома, решил понапрягать гугл (точнее: http://google.com/linux)

Почти сразу нашел две статьи мини-цикла:

Сделав по этому методу, немного помучавшись, получил все-таки рабочее окружение для отстройки и собрал в проект. Но не давало покоя много ручной суетливой работы, и, практически, полный отказ от уже реализованных методов поиска Qt библиотек в Cmake.

Именно по вышеуказанной причине я решил продолжить изыскания. Поиском по готовым модулям Cmake нашел упоминание некой директивы CMAKE_TOOLCHAIN_FILE, которая, по внутреннему ощущению, должна была мне помочь.

Дальнейший поиск привел меня на вики самого Cmake: How to use MinGW to cross compile software for Windows, где было сказано про тот самый toolchain file. С минимальными изменениями поместил его в каталог cmake в корне дерева проекта.

Ниже приведу листинг этого файла, назвал его win32-x-mingw32.cmake, в адоптации для ArchLinux:

win32-x-mingw32.cmake
# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)
 
# which compilers to use for C and C++
SET(CMAKE_C_COMPILER i486-mingw32-gcc)
SET(CMAKE_CXX_COMPILER i486-mingw32-g++)
SET(CMAKE_RC_COMPILER i486-mingw32-windres)
 
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH  /usr/i486-mingw32)
 
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
 
# next options is needed by some cases
#set(CMAKE_EXE_LINKER_FLAGS
#    ${CMAKE_EXE_LINKER_FLAGS}
#    -Wl,-subsystem,windows
#    -Wl,-enable-auto-import
#    -Wl,-enable-runtime-pseudo-reloc)
 
# Uncomment this if you have problem: unrecognized option '-rdynamic'
#set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)
 
set(MINGW32 1)

Это, конечно, не все, остались последние штрихи.

Использование данного тулчайна приведет к установке переменной CMAKE_CROSSCOMPILING, на основании этого, перед вызовом

find_package(Qt4 REQUIRED)

или аналогичного, достаточно вставить (в случае ArchLinux и пакета mingw32-qt из AUR или моей репы mingw32) следующий код:

if(CMAKE_CROSSCOMPILING)
  set(QT_HEADERS_DIR "/usr/i486-mingw32/include")
  set(QT_LIBRARY_DIR "/usr/i486-mingw32/lib")
endif()

После этого сборка осуществляется примерно так:

mkdir win32-build
cd win32-build
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/win32-x-mingw32.cmake ..
make

Все! :)

PS проверено на Cmake 2.8.1 и Qt 4.6.2

Updated: обновлён файл тулчейна

// Crowns 0.4.0

Выпустил версию 0.4.0 из основных изменений:

  • добавлена поддержка подложки (фоновой картинки), для реализации отображения синнузий
  • поддержка импорта из текстовых файлов данных с возрастом, плюс реализована совместимость со старыми форматами
  • оптимизация отрисовки проекций крон: реализована отрисовка кривыми Безье
  • экспорт построений в SVG

Как обычно версия для Windows отстроена путем кросс-компиляции, требуется тестирование.

Полный список изменений: ChangeLog
Скачать: Download

// Qwt - Qt виджеты для технических приложений

Ссылка в мемориз: http://qwt.sourceforge.net/

Из описания: библиотека включает визуальные виджеты, вспомогательные не визуальные классы, полезные в первую очередь для программ технической направленности. Так виджет для 2D построений предоставляет возможности масштабирования, ползунки, круговые органы управления, компасы, термометры, колеса прокрутки, кнопки для контроля или отображения значений переменных, массивов и т.д. Посмотреть все это добро можно на снимках: http://qwt.sourceforge.net/controlscreenshots.html

Библиотека распространяется на условиях модифицированной версии GPL, и достаточно либеральными исключениями, в частности разрешается статическая линковка, без раскрытия исходников, обязательному открытию подлежат только изменения в самой библиотеке. Подробности: http://qwt.sourceforge.net/qwtlicense.html

На странице проекта можно найти ссылки на производные работы, например:

  • QwtPolar, виджет для построения в полярной системе координат
  • QwtPlot3D, виджет для 3D построений и использованием OpenGL.
  • QtiPlot, готовое приложение, использующее виджет QwtPlot, для анализа и построения данных.

Существуют биндинги к питону и ruby.

Для пользователей ArchLinux в extra есть пакеты:

  • extra/qwt
  • extra/qwtplot3d

Т.е. сама библиотека и её 3D вариант.

// ./configure для qmake-based проектов

./configure для qmake-based проектов

Что бы очень не заморачиваться с формированием ./configure скрипта (и configure.exe программы для windows) при помощи autotools, когда вся их мощь не очень нужна, поможет проект qconf

Для Арчеводов, можно собрать из AUR svn версию: http://aur.archlinux.org/packages.php?ID=18686

Далее, на правах вольного пересказа английского README.

Intro

Итак, собираем, устанавливаем. Далее идем в корень вашего проекта, где лежит qmake файл, cоздаем там, для примера, файл myproject.qc примерно следующего содержания (это xml файл):

<qconf>
  <name>myproject</name>
  <profile>myproject.pro</profile>
</qconf>

дале пускаем:

qconf myproject.qc

На выходе получаем скрипт ./confugure с функционалом, в базовой части соответствующей autotools.

Если запустить без аргумента, будет выбран первый найденный .qc файл, если их найдено не будет - автоматически будет выбран первый .pro файл, и на основе его собран минимальный .qc файл (как в примере выше).

На целевой машине qconf не нужен (нужные только его модули конфигурации, но логично распространять их с самим проектом), нужен только разработчику.

Итак, на этот момент мы имеем готовый ./configure скрипт, который запускаем без параметров или смотрим ./configure –help.

Как это работает

После запуска ./configure, будет сформирован файл conf.pri, в котором будут содержаться различные переменные, отвечающие за сборку, основные из которых:

  • PREFIX
  • BINDIR
  • LIBDIR
  • QTDIR

Этот файл вы можете включать в ваш .pro файл:

include(conf.pri)

Т.е. обобщая, как это работает: qconf формирует, на основе .qc файла, скрипт ./configure, который, будучи запущенным, выполняет нужные вам проверки, создает conf.pri, запускает qmake для вашего .pro файла, который (как я выше написал) может включать conf.pri файл (соответственно, все что будет записано в conf.pri - будет доступно для qmake).

Возможные директивы для .qc файла

  • <name>NAME</name> - имя проекта
  • <profile>FILE.pro</profile> - .pro файл проекта
  • <dep>…</dep> - описываем зависимости, проверка на которые будет проводиться:
        <dep type="qt41">
       	<required/> <!-- обязательная зависимость -->
        </dep>
     

    тут:

    • «type» - определяет модуль (примеры модулей идут вместе с qconf, правда только два: qt31.qcm и qt41.qcm). Если type задана как pkg, проверка происходит при помощи pkg-config (выводы –libs и –cflags будут добавлены при компиляции):
    • опрашивается параметры:
      • «name»
      • «pkgname»
      • «version» в которой могут содержаться знаки отношения: «>=», «⇐», иначе принимается «=»
    • <required /> - определяет обязательность зависимости
    • <disabled /> - зависимость выключена
  • <arg>DESRIPTION</arg> - дополнительные агрументы для скрипта ./configure, сам аргумент будет доступен через переменную окружения QC_NAME (большими буквами, можно достучаться в модулях проверки через getenv), включают атрибуты:
    • «name» - имя
    • «arg» - значение
  • <lib /> - включает режима, когда собираемый проект - библиотека
    • <static /> - в случае, если <lib />, собирать статическую библиотеку
  • <noprefix /> - очищает PREFIX
  • <nobindir /> - очищает BINDIR
  • <prefix>PATH</prefix> - задаем PREFIX (по умолчанию: /usr/local)
  • <bindir>PATH</bindir> - задаем BINDIR (по умолчанию: PREFIX/bin)
  • <incdir>PATH</incdir> - задаем INCDIR (по умолчанию: PREFIX/include)
  • <libdir>PATH</libdir> - задаем LIBDIR (по умолчанию: PREFIX/lib)
  • <datadir>PATH</datadir> - задаем DATADIR (по умолчанию: PREFIX/share)
  • <qtdir>PATH</qtdir> - задаем QTDIR
  • <moddir>PATH</moddir> - добавляет пути поиска модулей для <dep></dep>
  • <qt3 /> - конфигурация для qt3 окружения (но сама qconf зависит от qt>=4.1, используйте версию 1.1 для qt3)

Да, пример где используется - psi, там же, в директории qcm можно найти очень много приятных модулей проверки.

Ну и да, это всего лишь помощь к qmake, но не замена. Его тоже настраивать нужно. И читать руководства по нему.

PS пока очень сумбурно, потому как, сейчас сам только с ним столкнулся, потом будет дополняться, уточняться.

// Qt4 и кросскомпиляция для win32

Попытаюсь пошагово оформить инструкцию, как делал у себя.

Для начала ставим пакеты (верно для ArchLinux, для других названия будут или аналогичными, или похожими):

pacman -S mingw32-binutils mingw32-gcc mingw32-runtime mingw32-w32api qt wine

Далее, мы должны взять Windows-версию библиотеки Qt4. Берем отсюда (текущая версия 4.6, хотя лучше взять ту, которая у вас в дистрибутиве, в момент написания, это: 4.5.3, кроме того, берем ту, что дял MinGW и, мы же православные, LGPL):
http://qt.nokia.com/downloads/windows-cpp (получим самую последнюю версию)

или отсюда:
http://get.qt.nokia.com/qt/source/

Я беру 4.5.3:

wget -c http://get.qt.nokia.com/qt/source/qt-win-opensource-4.5.3-mingw.exe

После скачивания, нам поможет wine, дабы установить библиотеку2). Если у вас возникают какие ошибки и wine отваливается, попытайтесь удалить каталог ~/.wine и запустить процесс заново.

Предварительно делаем такой финт ушами:

ln -s /usr/i486-mingw32 ~/.wine/drive_c/MinGW

Пусть потом установщик думает, что у нас реальный MinGW стоит, в частности - библиотека mingwm10.dll, которую вы должны предоставить в целевой используемой системе, как и необходимые dll от Qt.

Итак:

wine qt-win-opensource-4.5.3-mingw.exe

В ходе установки локации выбирайте умолчательный - не нужно мнить себя умнее паровоза и повышать энтропию. Когда будет спрошено где установлен MinGW - жмите просто Next, если ругнется, жмите Ok - нам не страшно. По окончании сего увлекательного процесса нащупать библиотеку можно в каталоге

~/.wine/drive_c/Qt/VERSION

где VERSION это версия, в нашем случае - 4.5.3

Далее, для своего удобства, хотя это может и быть идеологически неверным, я делаю следующие пассы от root:

(1) mkdir /opt/qt4-win32
(2) cp -a /home/USER/.wine/driver_c/Qt/VERSION /opt/qt4-win32/
(3) ln -s /opt/qt4-win32/VERSION /opt/qt4-cross

где (1) - создаие каталога в общедоступной системной директории, (2) - копирование нашей установленной версии Qt4 в этот самый общедоступный каталог (USER - имя пользователя от которого происходила установка), (3) - делаем симлинк на нашу рабочую версию, этот симлинк я буду использовать в описании spec-файла для qmake.

Следующий шаг, создание спека для Qmake (любителям других систем сборок - велком с дополнениями).

Хотя создание это громко сказано, в комплекте поставки есть спек:

/usr/share/qt/mkspecs/win32-g++

для работы с mingw32 в среде Windows, нам надо его только немного модифицировать, поэтому делаем копию:

cp -a /usr/share/qt/mkspecs/win32-g++ /usr/share/qt/mkspecs/win32-cross-g++

Переходим в /usr/share/qt/mkspecs/win32-cross-g++ и, можно наложить такой патч, бай ми:

diff -Nur win32-g++/qmake.conf win32-cross-g++/qmake.conf
--- win32-g++/qmake.conf	2009-10-08 09:30:49.000000000 +1100
+++ win32-cross-g++/qmake.conf	2009-04-10 13:56:14.809651570 +1100
@@ -14,7 +14,7 @@
 QMAKE_EXT_OBJ           = .o
 QMAKE_EXT_RES           = _res.o
 
-QMAKE_CC		= gcc
+QMAKE_CC		= i486-mingw32-gcc
 QMAKE_LEX		= flex
 QMAKE_LEXFLAGS		=
 QMAKE_YACC		= byacc
@@ -27,7 +27,7 @@
 QMAKE_CFLAGS_DEBUG	= -g
 QMAKE_CFLAGS_YACC	= -Wno-unused -Wno-parentheses
 
-QMAKE_CXX		= g++
+QMAKE_CXX		= i486-mingw32-g++
 QMAKE_CXXFLAGS		= $$QMAKE_CFLAGS
 QMAKE_CXXFLAGS_DEPS	= $$QMAKE_CFLAGS_DEPS
 QMAKE_CXXFLAGS_WARN_ON	= $$QMAKE_CFLAGS_WARN_ON
@@ -41,18 +41,18 @@
 QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
 QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
 
-QMAKE_INCDIR		=
-QMAKE_INCDIR_QT		= $$[QT_INSTALL_HEADERS]
-QMAKE_LIBDIR_QT		= $$[QT_INSTALL_LIBS]
+QMAKE_INCDIR		= /usr/i486-mingw32/include
+QMAKE_INCDIR_QT		= /opt/qt4-cross/include
+#QMAKE_INCDIR_QT         = /usr/include
+QMAKE_LIBDIR_QT		= /opt/qt4-cross/lib
 
 QMAKE_RUN_CC		= $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
 QMAKE_RUN_CC_IMP	= $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
 QMAKE_RUN_CXX		= $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
 QMAKE_RUN_CXX_IMP	= $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
 
-QMAKE_LINK		= g++
-QMAKE_LINK_C		= gcc
-QMAKE_LFLAGS		= -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
+QMAKE_LINK		= i486-mingw32-g++
+QMAKE_LFLAGS		= -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows
 QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl
 QMAKE_LFLAGS_EXCEPTIONS_OFF =
 QMAKE_LFLAGS_RELEASE	= -Wl,-s
@@ -72,35 +72,26 @@
 QMAKE_LIBS_COMPAT       = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32
 QMAKE_LIBS_QT_ENTRY     = -lmingw32 -lqtmain
 
-!isEmpty(QMAKE_SH) {
-    MINGW_IN_SHELL      = 1
-	QMAKE_DIR_SEP		= /
-	QMAKE_COPY		= cp
-	QMAKE_COPY_DIR		= xcopy /s /q /y /i
-	QMAKE_MOVE		= mv
-	QMAKE_DEL_FILE		= rm
-	QMAKE_MKDIR		= mkdir
-	QMAKE_DEL_DIR		= rmdir
-    QMAKE_CHK_DIR_EXISTS = test -d
-} else {
-	QMAKE_COPY		= copy /y
-	QMAKE_COPY_DIR		= xcopy /s /q /y /i
-	QMAKE_MOVE		= move
-	QMAKE_DEL_FILE		= del
-	QMAKE_MKDIR		= mkdir
-	QMAKE_DEL_DIR		= rmdir
-    QMAKE_CHK_DIR_EXISTS	= if not exist
-}
-
-QMAKE_MOC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc.exe
-QMAKE_UIC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic.exe
-QMAKE_IDC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc.exe
+
+MINGW_IN_SHELL      = 1
+QMAKE_DIR_SEP		= /
+QMAKE_COPY		= cp
+QMAKE_COPY_DIR		= cp -a
+QMAKE_MOVE		= mv
+QMAKE_DEL_FILE		= rm -rf
+QMAKE_MKDIR		= mkdir -p
+QMAKE_DEL_DIR		= rm -rf
+QMAKE_CHK_DIR_EXISTS = test -d
+
+QMAKE_MOC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc
+QMAKE_UIC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic
+QMAKE_IDC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc
 
 QMAKE_IDL		= midl
 QMAKE_LIB		= ar -ru
-QMAKE_RC		= windres
+QMAKE_RC		= i486-mingw32-windres
 QMAKE_ZIP		= zip -r -9
 
-QMAKE_STRIP		= strip
+QMAKE_STRIP		= i486-mingw32-strip
 QMAKE_STRIPFLAGS_LIB 	+= --strip-unneeded
 load(qt_config)

или на основании этого патча, внести изменения самостоятельно.

Видно, что основные отличия это:

  • указание компилятора
  • указание путей
  • указание разделителя директорий (принудительно) и системных команд, типа копирования или переименования.

На основе этого можете делать свои правки, готовый файл спека, кому нужно - вышлю.

Второй файл qplatformdefs.h в редактировании не нуждается.

После этого следует замечание: в .pro-файле среди аргументов параметра CONFIG, не должно быть debug, и ставить туда release, иначе сборка завершается ошибкой. Почему - не разбирался, кто решит проблему - отпишите.

Ну и последние акт, запускаем qmake так:

qmake -spec win32-cross-g++ file.pro
make

Вот собственно и все, если код написан правильно и корректно, то все должно собраться и слинковаться.

PS повторюсь: не забудьте в дистрибуцию добавить нужные для работы DLL в частности mingwm10.dll (его можно взять из поставки mingw32)

PPS Полезная ссылка для Арч-юзеров, вообще для кросскомпиляции: http://aur.archlinux.org/packages.php?K=mingw32, там в том числе есть пакет mingw32-qt, в первом коменте к которому PKGBUILD собирающий пакет с Qt 4.5.3 для mingw32

2)
в общем мы можем взять копию установки с какой нить Windows-машины, разницы никакой, или попытаться собрать самому из исходников

// Серия статей на IBM DeveloperWorks "Программирование на Qt"

Впринципе очередной пересказ документации и прочих книжек, но пусть тут будет, достаточно подробно и интересно:

// Crowns: версия 0.3.0

Закрыты задачи:

Подспутно некоторая оптимизация по скорости.

Страница для скачивания тут

// Софт на Qt4

Вот наткнулся случайно: список приложений написанных на Qt4 по английски, но выбрать себе можно. Мне вот понравился браузер Arora, в репозитариях есть arora (extra) и arora-git (community). Но про браузеры ещё будет пост ;)

// Книги по Qt4

Вот собственно темы из которых можно вырвать полезную информацию по данному вопросу:

UPD:

И вообще сайт с электронной компьютерной литературой: http://www.ebookscomputer.ru/

// 2007.04.16 Ядра, винты, Qt4

Kernel Panic

Что-то вот вылетело. Вчера решился таки убить нафиг Arch32 систему и переселить на постоянное место жительства Arch64 со старого Seagate на Maxtor. Дал отмашку:

[root: ~]# mount /dev/hda5 /mnt/hda5
[root: ~]# cd /mnt/hda5
[root: hda5]# dump -f - / | restore -r -f -

Через несколько минут имею в своём расположении… ага щаз, «перенесенную систему», Kernel Panic с пояснением: Hardware Exception (fail sync).

Вот и думаю: или винт сыпется (какой?) или ядро глючит и нужно обновляться.

Ладно, систему я таки перенес, делая покаталожно dump -f - /bin(usr,etc,…) | restore -r -f -; sync; sync; sync

Qt4

Потом решил вспомнить навыки программирования на Qt… Да что там, сразу на Qt4 ;)
Оказалось что того что знал на Qt3 уже достаточно устарело, пришлось заново штудировать инфу.

В результате нашел небольшую, куцую но.. мне достаточную IDE QDevelop, которая вообще, сама написана на Qt4, кроме того OpenSource и еще, есть бинарники для Window$.

Далее несколько ссылочек:

В общем пока вот все.