Development/Tutorials/KDE4 Porting Guide (ru): Difference between revisions

    From KDE TechBase
    (Added Russian translation)
     
    No edit summary
     
    (12 intermediate revisions by 6 users not shown)
    Line 1: Line 1:
    {{Template:I18n/Language Navigation Bar|Development/Tutorials/KDE4_Porting_Guide}}


    ==Введение==
    ==Введение==
    Line 17: Line 16:


    Например, если ваш исходный код находится в {{path|/path/to/src}}, то нужно выполнить следующее:
    Например, если ваш исходный код находится в {{path|/path/to/src}}, то нужно выполнить следующее:
    <code bash>
    <syntaxhighlight lang="bash">
    % cd /path/to/src
    % cd /path/to/src
    % $SVN/trunk/KDE/kdesdk/cmake/scripts/am2cmake --kde4
    % $SVN/trunk/KDE/kdesdk/cmake/scripts/am2cmake --kde4
    </code>
    </syntaxhighlight>
    Запустите <tt> am2cmake --help</tt>, чтобы проверить, нужен ли вам параметр <tt>--kde4</tt>.
    Запустите <tt> am2cmake --help</tt>, чтобы проверить, нужен ли вам параметр <tt>--kde4</tt>.


    Также есть специальная утилита, анализирующая полученные {{path|CMakeList.txt}} на наличие потенциальных проблем, она называется {{program|cmakelint.pl}}. Её можно найти в {{path|$SVN/trunk/kde/kdesdk/scripts}}. Пример её использования:
    Также есть специальная утилита, анализирующая полученные {{path|CMakeList.txt}} на наличие потенциальных проблем, она называется {{program|cmakelint.pl}}. Её можно найти в {{path|$SVN/trunk/kde/kdesdk/scripts}}. Пример её использования:
    <code bash>
    <syntaxhighlight lang="bash">
    % cd /path/to/src
    % cd /path/to/src
    % $SVN/trunk/KDE/kdesdk/scripts/cmakelint.pl CMakeLists.txt
    % $SVN/trunk/KDE/kdesdk/scripts/cmakelint.pl CMakeLists.txt
    </code>
    </syntaxhighlight>
    Её можно запускать внутри каталога с исходниками:
    Её можно запускать внутри каталога с исходниками:
    <code bash>
    <syntaxhighlight lang="bash">
    % cd /path/to/src
    % cd /path/to/src
    % find . -name CMakeLists.txt | \
    % find . -name CMakeLists.txt | \
      xargs $SVN/trunk/KDE/kdesdk/scripts/cmakelint.pl
      xargs $SVN/trunk/KDE/kdesdk/scripts/cmakelint.pl
    </code>
    </syntaxhighlight>


    ==Qt4 API==
    ==Qt4 API==
    Обзор перехода с Qt3 на Qt4 описан в статье Trolltech [http://www.trolltech.com/products/qt/whatsnew/porting "Moving from Qt 3 to Qt 4"]. Этот документ содержит отличный обзор главных изменений в Qt4. Настоятельно рекомендуем с ним ознакомиться.
    Обзор перехода с Qt3 на Qt4 описан в статье Trolltech [http://www.trolltech.com/products/qt/whatsnew/porting "Moving from Qt 3 to Qt 4"]. Этот документ содержит отличный обзор главных изменений в Qt4. Настоятельно рекомендуем с ним ознакомиться.


    Статья [http://doc.trolltech.com/4.2/porting4.html "Porting to Qt 4"] содержит потрясающее описание процесса портирования наряду со списком изменений в классах и функциях.
    Статья [http://doc.trolltech.com/latest/porting4.html "Porting to Qt 4"] содержит потрясающее описание процесса портирования наряду со списком изменений в классах и функциях.


    Этот документ описывает утилиту {{program|qt3to4}}, созданную Trolltech, которая может помочь при портировании Qt частей кода с Qt3 на Qt4, используя совместимые функции. Запустите {{program|qt3to4}}, как показано ниже:
    Этот документ описывает утилиту {{program|qt3to4}}, созданную Trolltech, которая может помочь при портировании Qt частей кода с Qt3 на Qt4, используя совместимые функции. Запустите {{program|qt3to4}}, как показано ниже:
    <code bash>
    <syntaxhighlight lang="bash">
    % $SVN/trunk/qt-copy/bin/qt3to4 [options] <Infile>, [Infile], ...
    % $SVN/trunk/qt-copy/bin/qt3to4 [options] <Infile>, [Infile], ...
    </code>
    </syntaxhighlight>
    Infile может быть исходным файлом или же файлом проекта. Если вы указали файл проекта, оканчивающийся на '.pro' или '.pri', {{program|qt3to4}} портирует все файлы, данного проекта.
    Infile может быть исходным файлом или же файлом проекта. Если вы указали файл проекта, оканчивающийся на '.pro' или '.pri', {{program|qt3to4}} портирует все файлы, данного проекта.


    Чтобы получить более подробную информацию, запустите {{program|qt3to4}} с параметром "--help" или посетите страницу [http://doc.trolltech.com/4.2/qt3to4.html "qt3to4-The Qt 3 to 4 Porting Tool"].
    Чтобы получить более подробную информацию, запустите {{program|qt3to4}} с параметром --help или посетите страницу [http://doc.trolltech.com/latest/qt3to4.html "qt3to4-The Qt 3 to 4 Porting Tool"].




    Так же существует программа {{program|remove-qt3-support.pl}}, входящая в состав модуля {{module|kdesdk}}. Она ищет и заменяет большое количество устаревших Qt3 функций. Просто запустите эту программу в каталоге с исходным кодом без всяких параметров.
    Также существует программа {{program|remove-qt3-support.pl}}, входящая в состав модуля {{module|kdesdk}}. Она ищет и заменяет большое количество устаревших Qt3 функций. Просто запустите эту программу в каталоге с исходным кодом без всяких параметров.
    <code bash>
    <syntaxhighlight lang="bash">
    % $SVN/trunk/KDE/kdesdk/scripts/qt4/remove-qt3-support.pl
    % $SVN/trunk/KDE/kdesdk/scripts/qt4/remove-qt3-support.pl
    </code>
    </syntaxhighlight>


    ==KDE4 API==
    ==KDE4 API==
    Line 61: Line 60:


    ==Qt Designer и UI файлы==
    ==Qt Designer и UI файлы==
    Файлы ".ui", созданные с помощью Qt3 должны быть конвертированы в новый формат Qt4. Это можно сделать с помощью утилиты {{program|uic3}}, входящей в состав Qt4.
    Файлы .ui, созданные с помощью Qt3 должны быть конвертированы в новый формат Qt4. Это можно сделать с помощью утилиты {{program|uic3}}, входящей в состав Qt4.


    <code bash>
    <syntaxhighlight lang="bash">
    % $SVN/trunk/qt-copy/bin/uic3 -convert file.ui > foo.ui
    % $SVN/trunk/qt-copy/bin/uic3 -convert file.ui > foo.ui
    % mv foo.ui file.ui
    % mv foo.ui file.ui
    </code>
    </syntaxhighlight>


    Если же вы предпочитаете графический интерфейс, то можно использовать Qt4 Designer.
    Если же вы предпочитаете графический интерфейс, то можно использовать Qt4 Designer.


    <code bash>
    <syntaxhighlight lang="bash">
    % $SVN/trunk/qt-copy/bin/designer file.ui
    % $SVN/trunk/qt-copy/bin/designer file.ui
    (you can save file.ui over top itself, or save to a new file)
    (you can save file.ui over top itself, or save to a new file)
    </code>
    </syntaxhighlight>
    {{Warning|Осторожно! При конвертировании теряются пользовательские слоты, столбцы таблиц и прочее. Так что вам потребуется восстановить это вручную.
    {{Warning|Осторожно! При конвертировании теряются пользовательские слоты, столбцы таблиц и прочее. Так что вам потребуется восстановить это вручную.}}
    Также необходимо запустить программу {{program|fixuifiles}} из модуля {{module|kdesdk}}:
    Также необходимо запустить программу {{program|fixuifiles}} из модуля {{module|kdesdk}}:
    <code bash>
    <syntaxhighlight lang="bash">
    % $SVN/trunk/KDE/kdesdk/scripts/fixuifiles
    % $SVN/trunk/KDE/kdesdk/scripts/fixuifiles
    </code>
    </syntaxhighlight>


    ==D-Bus==
    ==D-Bus==
    Line 86: Line 85:


    ==Значки==
    ==Значки==
    Имена значков в KDE4 основаны на [http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html спецификации именования значков freedesktop.org].
    Имена значков в KDE4 основаны на [http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html спецификации именования значков freedesktop.org].
    Это означает, что, как и имена значков, входящих в KDE4 (Oxygen), так и компоненты kdelibs соответствуют данной спецификации.
    Это означает, что, как и имена значков, входящих в KDE4 (Oxygen), так и компоненты kdelibs соответствуют данной спецификации.
    Line 92: Line 92:
    Для портирования имён значков с KDE3 на KDE4 запустите из корневого каталога вашего проекта скрипт [http://websvn.kde.org/*checkout*/trunk/KDE/kdesdk/scripts/qt4/adapt-to-icon-spec.py adapt-to-icon-spec.py] и следуйте инструкциям на экране.
    Для портирования имён значков с KDE3 на KDE4 запустите из корневого каталога вашего проекта скрипт [http://websvn.kde.org/*checkout*/trunk/KDE/kdesdk/scripts/qt4/adapt-to-icon-spec.py adapt-to-icon-spec.py] и следуйте инструкциям на экране.


    Этот скрипт автоматически конвертирует подтверждённые значки (например, с использованием KIcon или KIconLoader), пропускает значки при подтверждении пропуска и спрашивает, что делать с подтверждёнными. Так же выводится подсказка, содержащая контекст, таким образом, портирование сводится к нажатию 'y' и 'n'.
    Этот скрипт автоматически конвертирует подтверждённые значки (например, с использованием KIcon или KIconLoader), пропускает значки при подтверждении пропуска и спрашивает, что делать с подтверждёнными. Так жевыводится подсказка, содержащая контекст, таким образом, портирование сводится к нажатию 'y' и 'n'.
    The script automatically converts confirmable positives (e.g. uses of KIcon or KIconLoader), skips confirmable negatives and prompts for what to do with possible positives. It shows the latter with additonal context if desired and makes it a simple matter of pressing 'y' or 'n' for the possible hits to complete the porting.
    Скрипт выполняет преобразование автоматически если он "уверен" в своих действиях и спрашивает если нет.


    ==Локализация==
    ==Локализация==
    Чтобы создать ".pot" файл, скопируйте команды с правила 'messages' из {{path|Makefile.am}} вашего проекта в скрипт с именем {{path|Messages.sh}}. Вы можете считать, что старые переменные ($PREPARETIPS, $XGETTEXT, $podir и т.д.) по-прежнему существуют, но учтите, что между Makefile и shell-скриптами есть разница в синтаксисе.
     
    Чтобы создать .pot файл, скопируйте команды с правила 'messages' из {{path|Makefile.am}} вашего проекта в скрипт с именем {{path|Messages.sh}}. Вы можете считать, что старые переменные ($PREPARETIPS, $XGETTEXT, $podir и т.д.) по-прежнему существуют, но учтите, что между Makefile и shell-скриптами есть разница в синтаксисе.


    Учтите, что при использовании параметра -k с $XGETTEXT, потребуется явно указать все варианты, которые вы используете.
    Учтите, что при использовании параметра -k с $XGETTEXT, потребуется явно указать все варианты, которые вы используете.


    Например, вот как можно из правила 'messages':
    Например, вот как можно из правила 'messages':
    <code>
    <syntaxhighlight lang="text">
    messages: rc.cpp
    messages: rc.cpp
             rm -f tips.cpp
             rm -f tips.cpp
             $(PREPARETIPS) > tips.cpp
             $(PREPARETIPS) > tips.cpp
             $(XGETTEXT) -ktranslate *.cpp *.h -o $(podir)/kmail.pot
             $(XGETTEXT) -ktranslate *.cpp *.h -o $(podir)/kmail.pot
             rm -f tips.cpp
             rm -f tips.cpp
    </code>
    </syntaxhighlight>


    сделать следующий скрипт {{path|Messages.sh}}:
    сделать следующий скрипт {{path|Messages.sh}}:
    <code bash>
    <syntaxhighlight lang="bash">
    #! /usr/bin/env bash
    #! /usr/bin/env bash
    $PREPARETIPS > tips.cpp
    $PREPARETIPS > tips.cpp
    $XGETTEXT -ktranslate:1,1t -ktranslate:1c,2,2t *.cpp *.h -o $podir/kmail.pot
    $XGETTEXT -ktranslate:1,1t -ktranslate:1c,2,2t *.cpp *.h -o $podir/kmail.pot
    rm -f tips.cpp
    rm -f tips.cpp
    </code>
    </syntaxhighlight>




    Line 126: Line 127:
    * Не используйте рамку группировки (groupbox) без рамки, чтобы объединить виджеты! Просто воспользуйтесь менеджером компоновки (layout).
    * Не используйте рамку группировки (groupbox) без рамки, чтобы объединить виджеты! Просто воспользуйтесь менеджером компоновки (layout).


    * Do NOT use a groupbox without border to group widgets! Just use a layout.
    ==Дополнительные ресурсы==   
     
    ===Документация===   
    ==Resources==   
    ===Documentation===   
    * [http://doc.trolltech.com/4.3 Qt4.3 Reference]   
    * [http://doc.trolltech.com/4.3 Qt4.3 Reference]   
    * [http://www.crossplatform.ru/documentation/qtdoc4.3/index.php Частично переведенная документация к Qt 4.3]
    * [http://developer.kde.org/documentation/library/svn-api.php KDE4 API Reference]   
    * [http://developer.kde.org/documentation/library/svn-api.php KDE4 API Reference]   
    * [http://www.cmake.org/HTML/Documentation.html CMake Cross Platform Make]   
    * [http://www.cmake.org/HTML/Documentation.html CMake Cross Platform Make]   
    * [http://websvn.kde.org/*checkout*/trunk/KDE/kdelibs/KDE4PORTING.html KDE4PORTING.html]
    * [http://websvn.kde.org/*checkout*/trunk/KDE/kdelibs/KDE4PORTING.html KDE4PORTING.html]


    ===Other Help===   
    ===Где спросить===   
    * #kde4-devel on irc.freenode.net   
    * #kde4-devel on irc.freenode.net   


    [[Category:KDE4]]
    [[Category:KDE4]]

    Latest revision as of 09:34, 14 July 2012

    Введение

    Цель данного урока - помочь разработчикам портировать их Qt3/KDE3 приложения на Qt4/KDE4. Портирование KDE3 приложения - очень простой процесс. На данный момент написано очень много скриптов и документации, которые могут помочь в этом.


    Условные обозначения

    В данном уроке использованы следующие сокращения:

    • program - исполняемый файл
    • path - путь

    file - файл

    • $SVN - полный путь к дереву исходных кодов KDE


    CMake

    В отличие от KDE3, KDE4 приложения собираются с помощью CMake. Можно легко перейти от autotools к CMake, используя скрипт am2cmake, который можно найти в каталоге cmake/scripts модуля kdesdk. Этот скрипт добавит к старым файлам сборки файлы CMakeLists.txt.

    Например, если ваш исходный код находится в /path/to/src, то нужно выполнить следующее:

     % cd /path/to/src
     % $SVN/trunk/KDE/kdesdk/cmake/scripts/am2cmake --kde4
    

    Запустите am2cmake --help, чтобы проверить, нужен ли вам параметр --kde4.

    Также есть специальная утилита, анализирующая полученные CMakeList.txt на наличие потенциальных проблем, она называется cmakelint.pl. Её можно найти в $SVN/trunk/kde/kdesdk/scripts. Пример её использования:

     % cd /path/to/src
     % $SVN/trunk/KDE/kdesdk/scripts/cmakelint.pl CMakeLists.txt
    

    Её можно запускать внутри каталога с исходниками:

     % cd /path/to/src
     % find . -name CMakeLists.txt | \
       xargs $SVN/trunk/KDE/kdesdk/scripts/cmakelint.pl
    

    Qt4 API

    Обзор перехода с Qt3 на Qt4 описан в статье Trolltech "Moving from Qt 3 to Qt 4". Этот документ содержит отличный обзор главных изменений в Qt4. Настоятельно рекомендуем с ним ознакомиться.

    Статья "Porting to Qt 4" содержит потрясающее описание процесса портирования наряду со списком изменений в классах и функциях.

    Этот документ описывает утилиту qt3to4, созданную Trolltech, которая может помочь при портировании Qt частей кода с Qt3 на Qt4, используя совместимые функции. Запустите qt3to4, как показано ниже:

     % $SVN/trunk/qt-copy/bin/qt3to4 [options] <Infile>, [Infile], ...
    

    Infile может быть исходным файлом или же файлом проекта. Если вы указали файл проекта, оканчивающийся на '.pro' или '.pri', qt3to4 портирует все файлы, данного проекта.

    Чтобы получить более подробную информацию, запустите qt3to4 с параметром --help или посетите страницу "qt3to4-The Qt 3 to 4 Porting Tool".


    Также существует программа remove-qt3-support.pl, входящая в состав модуля kdesdk. Она ищет и заменяет большое количество устаревших Qt3 функций. Просто запустите эту программу в каталоге с исходным кодом без всяких параметров.

     % $SVN/trunk/KDE/kdesdk/scripts/qt4/remove-qt3-support.pl
    

    KDE4 API

    Большая часть работы при портировании заключается в переименовании классов и заголовочных файлов. В связи с тем, что делать это вручную довольно утомительно, можно использовать скрипт adapt-to-kde4-api.pl, который можно найти в каталоге scripts/qt4 модуля kdesdk. Он просмотрит все ваши файлы и выведет diff (различия), который можно использовать, чтобы пропатчить ваш код.

    Теперь когда сделаны простые замены, нужно пройтись по коду, чтобы портировать, например, на новый KAction API. Документация по всем изменениям в API может быть найдена в KDE4PORTING.html из модуля kdelibs.


    Qt Designer и UI файлы

    Файлы .ui, созданные с помощью Qt3 должны быть конвертированы в новый формат Qt4. Это можно сделать с помощью утилиты uic3, входящей в состав Qt4.

     % $SVN/trunk/qt-copy/bin/uic3 -convert file.ui > foo.ui
     % mv foo.ui file.ui
    

    Если же вы предпочитаете графический интерфейс, то можно использовать Qt4 Designer.

     % $SVN/trunk/qt-copy/bin/designer file.ui
     (you can save file.ui over top itself, or save to a new file)
    
    Warning
    Осторожно! При конвертировании теряются пользовательские слоты, столбцы таблиц и прочее. Так что вам потребуется восстановить это вручную.

    Также необходимо запустить программу fixuifiles из модуля kdesdk:

     % $SVN/trunk/KDE/kdesdk/scripts/fixuifiles
    

    D-Bus

    Вместо DCOP, используемого в KDE3, в KDE4 для взаимодействия программ друг с другом используется D-Bus. Портирование с DCOP на D-BUS является обширной темой и очень детально описано в Уроке по портированию на D-Bus.

    Для получения дополнительной информации обратитесь к Уроку по D-Bus.

    Значки

    Имена значков в KDE4 основаны на спецификации именования значков freedesktop.org. Это означает, что, как и имена значков, входящих в KDE4 (Oxygen), так и компоненты kdelibs соответствуют данной спецификации.


    Для портирования имён значков с KDE3 на KDE4 запустите из корневого каталога вашего проекта скрипт adapt-to-icon-spec.py и следуйте инструкциям на экране.

    Этот скрипт автоматически конвертирует подтверждённые значки (например, с использованием KIcon или KIconLoader), пропускает значки при подтверждении пропуска и спрашивает, что делать с подтверждёнными. Так жевыводится подсказка, содержащая контекст, таким образом, портирование сводится к нажатию 'y' и 'n'. Скрипт выполняет преобразование автоматически если он "уверен" в своих действиях и спрашивает если нет.

    Локализация

    Чтобы создать .pot файл, скопируйте команды с правила 'messages' из Makefile.am вашего проекта в скрипт с именем Messages.sh. Вы можете считать, что старые переменные ($PREPARETIPS, $XGETTEXT, $podir и т.д.) по-прежнему существуют, но учтите, что между Makefile и shell-скриптами есть разница в синтаксисе.

    Учтите, что при использовании параметра -k с $XGETTEXT, потребуется явно указать все варианты, которые вы используете.

    Например, вот как можно из правила 'messages':

     messages: rc.cpp
            rm -f tips.cpp
            $(PREPARETIPS) > tips.cpp
            $(XGETTEXT) -ktranslate *.cpp *.h -o $(podir)/kmail.pot
            rm -f tips.cpp
    

    сделать следующий скрипт Messages.sh:

     #! /usr/bin/env bash
     $PREPARETIPS > tips.cpp
     $XGETTEXT -ktranslate:1,1t -ktranslate:1c,2,2t *.cpp *.h -o $podir/kmail.pot
     rm -f tips.cpp
    


    Что можно, а что нельзя

    • Не используйте старые классы сокетов
    • Не используйте QPtrList, особенно setAutoDelete()
    • Не используйте растровые операции.
    • Постарайтесь не использовать {qt3|QHBox}}, QVBox, QGrid. Отдавайте предпочтения менеджерам компоновки (layouts)
    • Не используйте фреймы с рамками группировки (groupboxes), текстовыми метками (labels) или строками редактирования (lineedits), чтобы создать новый виджет. Например, вместо добавления впалой рамки (как у lineedit) к label, воспользуйтесь готовым виджетом KLineEdit. Или вместо того, чтобы использовать KLineEdit без рамки, чтобы иметь возможность копировать содержимое, воспользуйтесь KActiveLabel.
    • Не используйте рамку группировки (groupbox) без рамки, чтобы объединить виджеты! Просто воспользуйтесь менеджером компоновки (layout).

    Дополнительные ресурсы

    Документация

    Где спросить

    • #kde4-devel on irc.freenode.net