Digikam/CodingSprint2014: Difference between revisions
m (395 revisions imported) |
|||
(217 intermediate revisions by 7 users not shown) | |||
Line 1: | Line 1: | ||
== KDE Framework Port == | == KDE Framework Port == | ||
Line 11: | Line 7: | ||
<source lang="bash"> | <source lang="bash"> | ||
$>git checkout master | $>git checkout master | ||
$>git pull -rebase | $>git pull --rebase | ||
$>git checkout -b frameworks | $>git checkout -b frameworks | ||
$>git push origin frameworks:frameworks | $>git push origin frameworks:frameworks | ||
Line 31: | Line 27: | ||
* [https://projects.kde.org/projects/extragear/libs/libkgeomap/repository/show?rev=frameworks Libkgeomap] | * [https://projects.kde.org/projects/extragear/libs/libkgeomap/repository/show?rev=frameworks Libkgeomap] | ||
* [https://projects.kde.org/projects/extragear/graphics/digikam/digikam-software-compilation/repository/show?rev=frameworks digiKam Software Compilation] | * [https://projects.kde.org/projects/extragear/graphics/digikam/digikam-software-compilation/repository/show?rev=frameworks digiKam Software Compilation] | ||
* [https://projects.kde.org/projects/extragear/graphics/ | * [https://projects.kde.org/projects/extragear/graphics/kipi-plugins/repository/show?rev=frameworks Kipi-plugins] | ||
* [https://projects.kde.org/projects/extragear/graphics/ | * [https://projects.kde.org/projects/extragear/graphics/digikam/repository/show?rev=frameworks digiKam] | ||
=== Kipi-plugins Refactoring === | === Kipi-plugins Refactoring === | ||
Line 48: | Line 44: | ||
** advancedslideshow | ** advancedslideshow | ||
** flashexport | ** flashexport | ||
** kmlexport | ** kmlexport | ||
** acquireimages | ** acquireimages | ||
Line 57: | Line 52: | ||
* Tools in pending stage : | * Tools in pending stage : | ||
** dlnaexport <=== Needs HUpnp lib Qt5 port | |||
** htmlexport <=== Nobody maintain this code since a while, but tool still used. | ** htmlexport <=== Nobody maintain this code since a while, but tool still used. | ||
** photolayoutseditor <=== A complex but powerful tool. Will be complex to port. | ** photolayoutseditor <=== A complex but powerful tool. Will be complex to port. | ||
Line 116: | Line 112: | ||
| | | | ||
* C++ auto_ptr warnings from Exiv2 API disabled. | * C++ auto_ptr warnings from Exiv2 API disabled. | ||
* Library depend of : | |||
** KF5::I18n (translations) | |||
** KF5::TextWidgets (MsgTextEdit is based on KTextEdit) | |||
|- | |- | ||
| '''libkexiv2/tests''' | | '''libkexiv2/tests''' | ||
Line 124: | Line 123: | ||
| no | | no | ||
| Gilles, Laurent | | Gilles, Laurent | ||
| | |Code do not depend of KF5 | ||
|} | |} | ||
Line 152: | Line 151: | ||
* RActionThreadBase is ported to QThreadPool + QRunnable API instead ThreadWeaver. | * RActionThreadBase is ported to QThreadPool + QRunnable API instead ThreadWeaver. | ||
* KIntNumInput and KDoubleNumInput are deprecated and removed as dependencies. We use Krita Int and Double input widgets instead. See [https://bugs.kde.org/show_bug.cgi?id=284216 bug #284216] for details. | * KIntNumInput and KDoubleNumInput are deprecated and removed as dependencies. We use Krita Int and Double input widgets instead. See [https://bugs.kde.org/show_bug.cgi?id=284216 bug #284216] for details. | ||
* Library depend of: | |||
** KF5::I18n (translations). | |||
** KF5::ConfigCore (KConfigGroup used in widgets). | |||
|- | |- | ||
| '''libkdcraw/tests''' | | '''libkdcraw/tests''' | ||
Line 161: | Line 163: | ||
| Gilles, Laurent, Veaceslav | | Gilles, Laurent, Veaceslav | ||
| | | | ||
* Code do not depend of KF5 | |||
*Multithreaded RAW to PNG GUI test program now use DCrawSettingsWidget to tune Raw decoding settings, and is ported to RActionThreadBase to process conversions on all core CPU. | *Multithreaded RAW to PNG GUI test program now use DCrawSettingsWidget to tune Raw decoding settings, and is ported to RActionThreadBase to process conversions on all core CPU. | ||
|} | |} | ||
Line 179: | Line 182: | ||
| '''libkipi/src''' | | '''libkipi/src''' | ||
| done | | done | ||
| | | done | ||
| | | done | ||
| yes | | yes | ||
| no | | no | ||
Line 187: | Line 190: | ||
* libkipi/version.h file renamed as libkipi_config.h to host only SO version ID shared with kipi plugins. | * libkipi/version.h file renamed as libkipi_config.h to host only SO version ID shared with kipi plugins. | ||
* API changes a little bit : path() => url(). | * API changes a little bit : path() => url(). | ||
*Library depend of : | |||
** KF5::I18n (translations) | |||
** KF5::Config (KConfigGroup and KSharedConfig) | |||
** KF5::XmlGui (plugins based on KXMLGuiCLient) | |||
** KF5::Service (plugins use KService) | |||
|- | |- | ||
| '''libkipi/test''' | | '''libkipi/test''' | ||
| done | | done | ||
| | | done | ||
| | | done | ||
| yes | | yes | ||
| no | |||
| Gilles, Laurent, Mohamed | | Gilles, Laurent, Mohamed | ||
| | | | ||
Line 216: | Line 224: | ||
| '''libkface/src''' | | '''libkface/src''' | ||
| done | | done | ||
| | | done | ||
| | | done | ||
| yes | | yes | ||
| no | | no | ||
| Gilles, Laurent, Teemu | | Gilles, Laurent, Teemu | ||
| | |Library only depend of KF5::I18n | ||
|- | |- | ||
| '''libkface/tests''' | | '''libkface/tests''' | ||
| done | | done | ||
| | | done | ||
| | | done | ||
| yes | | yes | ||
| no | | no | ||
| Gilles, Laurent, Teemu | | Gilles, Laurent, Teemu | ||
| | | Code do not depend of KF5 | ||
|} | |} | ||
Line 248: | Line 256: | ||
| '''libkgeomap/src''' | | '''libkgeomap/src''' | ||
| done | | done | ||
| | | done | ||
| done | | done | ||
| yes | | yes | ||
| no | | no | ||
| Gilles, Laurent, Teemu | | Gilles, Laurent, Teemu, Mohamed | ||
| | | | ||
* Needs Marble code from [https://projects.kde.org/projects/kde/kdeedu/marble/repository/show?rev= | * Library depend of: | ||
* We need to detect the Marble version somehow, to avoid linking KF5 build against Qt4 version of Marble. | ** KF5::I18n (translations). | ||
* | ** KF5::Config (KConfigGroup used in widgets). | ||
* Needs Marble code from [https://projects.kde.org/projects/kde/kdeedu/marble/repository/show?rev=master master git branch] compiled with cmake option '''-DQT5BUILD=ON'''. | |||
* <span style="background:salmon">TODO</span> We need to detect the Marble version somehow, to avoid linking KF5 build against Qt4 version of Marble. We still use FindMarble cmake script from KDE4. Marble need to be ported as pure KF5 frameworks component. | |||
* <span style="background:lightgreen">DONE</span> KHTML based class HTMLWidget must be ported to Qt5::Webkit. | |||
|- | |- | ||
| '''libkgeomap/tests''' | | '''libkgeomap/tests''' | ||
| done | | done | ||
| | | done | ||
| done | | done | ||
| yes | | yes | ||
Line 269: | Line 280: | ||
| '''libkgeomap/calibrator''' | | '''libkgeomap/calibrator''' | ||
| done | | done | ||
| | | done | ||
| done | | done | ||
| yes | | yes | ||
Line 278: | Line 289: | ||
| '''libkgeomap/demo''' | | '''libkgeomap/demo''' | ||
| done | | done | ||
| | | done | ||
| done | | done | ||
| yes | | yes | ||
Line 316: | Line 327: | ||
**${KF5KDcraw_LIBRARIES} | **${KF5KDcraw_LIBRARIES} | ||
**KF5kipiplugins | **KF5kipiplugins | ||
* Use '''kipiplugins_debug.h''' header in plugins to handle debug space. | |||
* ${KF5*_LIBRARIES} are populated by MacroLocalLibs.cmake | * ${KF5*_LIBRARIES} are populated by MacroLocalLibs.cmake | ||
* Add a new common class to process images resizement based SendImage::ImageResize | |||
|- | |- | ||
| '''Kipi-plugins/tests''' | | '''Kipi-plugins/tests''' | ||
Line 336: | Line 349: | ||
| | | | ||
|- | |- | ||
| '''Kipi-plugins/ | | '''Kipi-plugins/timeadjust''' | ||
| done | | done | ||
| | | uncomplete | ||
| | | uncomplete | ||
| yes | | yes | ||
| no | |||
|Gilles, Laurent | |Gilles, Laurent | ||
| | | | ||
|- | |- | ||
| '''Kipi-plugins/ | | '''Kipi-plugins/sendimages''' | ||
| done | | done | ||
| | | uncomplete | ||
| | | uncomplete | ||
| yes | | yes | ||
| no | |||
|Gilles, Laurent | |Gilles, Laurent | ||
| | | | ||
Line 356: | Line 369: | ||
| '''Kipi-plugins/kmlexport''' | | '''Kipi-plugins/kmlexport''' | ||
| done | | done | ||
| | | uncomplete | ||
| | | uncomplete | ||
| yes | | yes | ||
| no | |||
|Gilles, Laurent | |Gilles, Laurent | ||
| | | | ||
|- | |- | ||
| '''Kipi-plugins/ | | '''Kipi-plugins/printimages''' | ||
| done | | done | ||
| | | uncomplete | ||
| | | uncomplete | ||
| yes | | yes | ||
| no | |||
|Gilles, Laurent | |Gilles, Laurent | ||
| | | Postscript support have been removed from QPrinter. Option is now removed from assistant. | ||
|- | |- | ||
| '''Kipi-plugins/flashexport''' | | '''Kipi-plugins/flashexport''' | ||
| done | | done | ||
| | | uncomplete | ||
| | | uncomplete | ||
| yes | |||
| no | | no | ||
|Gilles, Laurent | |Gilles, Laurent | ||
| | | | ||
|} | |} | ||
==== digiKam ==== | ==== digiKam Software Compilation ==== | ||
{| border="1" class="wikitable" | {| border="1" class="wikitable" | ||
Line 403: | Line 416: | ||
| Gilles | | Gilles | ||
| | | | ||
* 2 new Cmake options have been add to enable/disable digiKam core and Kipi-plugins compilation (disabled by default for the moment). | * 2 new Cmake options have been add to enable/disable digiKam core and Kipi-plugins compilation (digiKam still disabled by default for the moment). | ||
* List of checkout repositories managed by "download-repos" scripts is reduced to current sub projects already ready to support KF5. "frameworks" branches are automatically switched. See ".gitslaves" for details. | * List of checkout repositories managed by "download-repos" scripts is reduced to current sub projects already ready to support KF5. "frameworks" branches are automatically switched. See ".gitslaves" for details. | ||
* New MacroLocalLibs.cmake must be used in Kipi-plugins and digiKam Core to wrap local or system libraries (libkipi, likdcraw, libkexiv2, etc) when compilation is done under SC or not. | * New MacroLocalLibs.cmake must be used in Kipi-plugins and digiKam Core to wrap local or system libraries (libkipi, likdcraw, libkexiv2, etc) when compilation is done under SC or not. | ||
Line 415: | Line 428: | ||
| Gilles | | Gilles | ||
| | | | ||
|} | |||
==== digiKam Core ==== | |||
{| border="1" class="wikitable" | |||
|- | |- | ||
| '''digiKam''' | ! Component | ||
| | ! Cmake port | ||
| | ! pure Qt5 port | ||
| | ! pure KF5 port | ||
! compile | |||
! warnings | |||
! Who | |||
! Remarks | |||
|- | |||
| '''digiKam/data''' | |||
| done | |||
| not applicable | |||
| not applicable | |||
| yes | |||
| no | |||
| Gilles, Laurent | |||
| | | | ||
|- | |||
| '''digiKam/libs''' | |||
| done | |||
| done | |||
| done | |||
| yes | |||
| no | |||
| Gilles, Laurent, Teemu, Alin, Veaceslav | |||
| | | | ||
* <span style="background:salmon">TODO</span> ProxyLineEdit is based on KLineEdit and must be ported to QLineEdit, but it use KLineEdit::clearButtonUsedSize() which do not exist with QLineEdit. | |||
* <span style="background:orange">UNCOMPLETE</span> SearchTextBar is based on KLineEdit and must be ported to QLineEdit, but it use completion model class ModelCompletion based on KCompletion Which must be ported to QCompleter. | |||
* <span style="background:lightgreen">DONE</span> ICCSettings : Q_WS__X11 have been removed with Qt5. X11 detection is performed by CMake and rules are set as definition into digikam_config.h | |||
* <span style="background:salmon">TODO</span> Port LoadingCache from KDirWatch to QFileSystemWatcher. | |||
* <span style="background:salmon">TODO</span> When QFileSystemWtyacher port is complete, check if KInotify still mandatory. | |||
|- | |||
| '''digiKam/app''' | |||
| done | |||
| done | |||
| done | |||
| yes | |||
| no | |||
| Gilles, Laurent, Teemu, Alin | |||
| | | | ||
* <span style="background:orange">UNCOMPLETE</span> AddTagsLineEdit is based on KLineEdit and must be ported to QLineEdit, but it use completion model class ModelCompletion based on KCompletion Which must be ported to QCompleter. | |||
* <span style="background:lightgreen">DONE</span> WelcomePageView ported from KHTMLPart to QWebView. KParts and KHtml dependencies removed from digiKam. | |||
* <span style="background:lightgreen">DONE</span> WelcomePageView HTML rendering is completly broken. Check if CSS and HTML code are conform. Note : this is not due to Qt5 port as KHTML done the same result. New layout introduced to host best users photo as background image. [https://www.flickr.com/photos/digikam/16628134940/ See example here for details]. | |||
* <span style="background:lightgreen">DONE</span> MediaPlayerView ported from Phonon to QMediaPlayer. Phonon dependency removed from digiKam. New CMake option add to enable/disable QMediaPlayer support. | |||
* <span style="background:salmon">TODO</span> Port AlbumWatch from KDirWatch to QFileSystemWatcher | |||
|- | |||
| '''digiKam/utilities''' | |||
| done | |||
| done | |||
| done | |||
| yes | |||
| no | |||
| Gilles, Laurent, Teemu, Alin, Mohamed | |||
| | | | ||
* <span style="background:salmon">TODO</span> CameraController use KProcess and KMacroExpander and need to be ported to QProcess. | |||
|- | |||
| '''digiKam/imageplugins''' | |||
| done | |||
| done | |||
| done | |||
| yes | |||
| no | |||
| Gilles, Laurent, Teemu | |||
| | |||
* <span style="background:salmon">TODO</span> Remove editor plugins interface and move tools directly to editor implementation. | |||
|- | |||
| '''digiKam/kioslave''' | |||
| done | |||
| done | |||
| done | |||
| yes | |||
| no | |||
| Gilles, Laurent, Teemu | |||
| | |||
* <span style="background:salmon">TODO</span> Remove KIO-Slaves and move code to database core using multithreading. See this [https://community.kde.org/GSoC/2015/Ideas#Project:_Re-write_database_KIO-slaves_as_pure_Qt5_using_multithreading GoSC 2015 project for details]. | |||
|- | |||
| '''digiKam/showfoto''' | |||
| done | |||
| done | |||
| done | |||
| yes | |||
| no | |||
| Gilles, Laurent, Teemu | |||
| | |||
|- | |||
| '''digiKam/databaseserver''' | |||
| done | |||
| done | |||
| done | |||
| yes | |||
| no | |||
| Gilles, Laurent, Teemu | |||
| | |||
|- | |||
| '''digiKam/tests''' | |||
| done | |||
| done | |||
| done | |||
| yes | |||
| no | |||
| Gilles, Laurent, Teemu | |||
| | |||
* <span style="background:salmon">TODO</span> 2 test tools do not link yet and are disable from compilation rules | |||
|} | |} | ||
=== Recommendations === | === Recommendations === | ||
Porting to KF5 is divided in | Porting to KF5 is divided in 4 stages: | ||
1/ Change | 1/ Change CMake files. Some Laurent scripts do this stuff. We use now | ||
ECM scripts collection from KDE core to manage dependencies and report on the | ECM scripts collection from KDE core to manage dependencies and report on the | ||
console. Some macros disappear, and are replaced by new ones. For this | console. Some macros disappear, and are replaced by new ones. For this | ||
job, it's recommended to look well all done in | job, it's recommended to look well all done in CMake files from libkexiv2 | ||
and libkdcraw already ported and polished. | and libkdcraw already ported and polished. | ||
2/ Port | 2/ Port C++ code using KDE4Support. This include older classes from Qt4 | ||
and KDE4 to make transition faster. This will help to have quickly a | and KDE4 to make transition faster. This will help to have quickly a | ||
code compilable, but this will generate a lots of deprecated warnings. | code compilable, but this will generate a lots of deprecated warnings. | ||
First regression tests must be done at this stage to see if nothing is broken. | First regression tests must be done at this stage to see if nothing is broken. | ||
3/ Port | 3/ Port C++ code to pure KF5. The goal of KF5 is to reduce KDELibs | ||
fingerprint everywhere, when it's possible. Qt API will be used in | fingerprint everywhere, when it's possible. Qt API will be used in | ||
priority against KF5 API. But sometime, this will be not possible as | priority against KF5 API. But sometime, this will be not possible as | ||
Line 448: | Line 561: | ||
will become an incubator for new implementations which will move later | will become an incubator for new implementations which will move later | ||
to Qt. Also, to have the most of code using pure Qt5 will simplify | to Qt. Also, to have the most of code using pure Qt5 will simplify | ||
future transitions more easy to do. | future transitions more easy to do. Removing KDE4Support dependency | ||
will force to use non-deprecated KF5 API. | |||
4/ Port C++ code to pure Qt5. Porting most of KF5 Api to use Qt5 instead is | |||
prefered, when it's possible. Another important change in Qt5 is the non-support | |||
of char pointer with QString. | |||
In first stage we must use '''remove_definitions(-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII)''' | |||
in CMake script to compile code. These definitions force to not use deprecated QString methods. | |||
Another definition to add while Qt5 porting is '''add_definitions(-DQT_NO_URL_CAST_FROM_STRING)''' about cast between QString and QUrl. | |||
In last stage we must use '''remove_definition(-DQT_DEPRECATED_SINCE(5,0))''' in CMake script to compile code. These definitions force to disable deprecated methods in Qt API. | |||
=== Common changes to port code === | === Common changes to port code === | ||
Line 468: | Line 593: | ||
| Not yet ported code sections must be commented with compiler warnings printed on the console | | Not yet ported code sections must be commented with compiler warnings printed on the console | ||
|- | |- | ||
| | | KDE4_BUILD_TESTS=ON | ||
| '''BUILD_TESTING=ON''' | | '''BUILD_TESTING=ON''' | ||
| CMake flag to build tests sub-dir. | | CMake flag to build tests sub-dir. | ||
|- | |- | ||
| | | CMAKE_BUILD_TYPE=debugfull | ||
| '''CMAKE_BUILD_TYPE=debug''' | | '''CMAKE_BUILD_TYPE=debug''' | ||
| CMake flag to build code with debug symbols. | | CMake flag to build code with debug symbols. | ||
|- | |- | ||
| kDebug()/kWarning()/kError() | | kDebug() / kWarning() / kError() | ||
| '''qCDebug(FOO_LOG)/qCWarning(FOO_LOG)/qCCritical(FOO_LOG)''' | | '''qCDebug(FOO_LOG) / qCWarning(FOO_LOG) / qCCritical(FOO_LOG)''' | ||
| | | | ||
* New "foo_debug.h" and "foo_debug.cpp" files must be created to declare debug space. | * New "foo_debug.h" and "foo_debug.cpp" files must be created to declare debug space. | ||
* "foo_debug.h" is not shared. For shared a library, this header must be placed as private in implementation files, not header files. | * "foo_debug.h" is not shared. For shared a library, this header must be placed as private in implementation files, not header files. | ||
|- | |- | ||
| #include "foo.moc" | | | ||
| | <source lang="cpp-qt"> | ||
#include "foo.moc" | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
#include "foo.h" | |||
</source> | |||
| | | | ||
* To prevent compilation errors with Qt5. Qt will generate moc_foo.h files instead. Header file of a class declaration must be placed on top of included header files list from implementation file. | * To prevent compilation errors with Qt5. Qt will generate moc_foo.h files instead. Header file of a class declaration must be placed on top of included header files list from implementation file. | ||
* Special case : KF5 plugin factory needs moc header file included at end of plugin implementation to prevent broken linking. | * Special case : KF5 plugin factory needs moc header file included at end of plugin implementation to prevent broken linking. | ||
|- | |- | ||
| KUrl::directory() | | | ||
| | <source lang="cpp-qt"> | ||
KUrl::directory() | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QUrl::adjusted(QUrl::RemoveFilename).path() | |||
</source> | |||
| | | | ||
|- | |- | ||
| | | | ||
| | <source lang="cpp-qt"> | ||
KDiskFreeSpaceInfo | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QStorageInfo | |||
</source> | |||
| | | | ||
|- | |- | ||
| | | | ||
| | <source lang="cpp-qt"> | ||
KUrl::setFileName(newFileName) | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QUrl::setPath(QUrl::path() + newFileName) | |||
</source> | |||
| | | | ||
|- | |- | ||
| | | | ||
| | <source lang="cpp-qt"> | ||
KUrl url; | |||
url.adjustPath(KUrl::AddTrailingSlash); | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QUrl url; | |||
url.setPath(url.path() + '/'); | |||
</source> | |||
| | | | ||
|- | |- | ||
| | | | ||
<source lang="cpp-qt"> | |||
KDialog::spacingHint() | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing) | |||
</source> | |||
| | | | ||
|- | |- | ||
| KStandardDirs::installPath("data") + QString("filename") | | | ||
|'''QStandardPaths:: | <source lang="cpp-qt"> | ||
KDialog::marginHint() | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QApplication::style()->pixelMetric(QStyle::PM_DefaultChildMargin) | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KComponentData::mainComponent().componentName() | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QApplication::applicationName() | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KComponentData::mainComponent().aboutData()->homepage() | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
KAboutData::applicationData().homepage() | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KIconLoader::SmallIcon("icon_name", size) | |||
</source> | |||
or | |||
<source lang="cpp-qt"> | |||
KIconLoader::global()->loadIcon("icon_name", size) | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QIcon::fromTheme("icon_name").pixmap(size) | |||
</source> | |||
| | |||
*Adjust size value : | |||
**Small = 16 (default from KIconLoader::SmallIcon()), | |||
**SmallMedium = 22, | |||
**Medium = 32, | |||
**Large = 48, | |||
**Huge = 64, | |||
**Enormous = 128 | |||
* Icon must be installed with desktop theme icons. | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KStandardDirs::installPath("data") + QString("filename") | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QStandardPaths::locate(QStandardPaths::GenericDataLocation, | |||
QString("filename")) | |||
</source> | |||
| File to open in read-only. File already exist. | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KStandardDirs::installPath("xdgdata-apps") + QString("filename") | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QStandardPaths::locate(QStandardPaths::ApplicationsLocation, | |||
QString("filename")) | |||
</source> | |||
| File to open in read-only. File already exist. | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KStandardDirs::locateLocal("data", QString("filename")) | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) | |||
+ '/' + QString("filename") | |||
</source> | |||
| File to open in read-only. File already exist. | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
QString dir = KStandardDirs::locateLocal("data", | |||
QString("dirname"), true) | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QString dir = | |||
QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) | |||
+ '/' + QString("dirname"); | |||
QDir().mkpath(dir); | |||
</source> | |||
| Dir to open in read-write. Create dir if it do not exist. | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KUrlLabel | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
KDcrawIface::RActiveLabel | |||
</source> | |||
| | |||
* Slot used to process url can be dropped. | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KSeparator | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
KDcrawIface::RLineWidget | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KXmlGuiWindow::restoreWindowSize(group); | |||
KDialog::restoreDialogSize(group); | |||
</source> | |||
and | |||
<source lang="cpp-qt"> | |||
KXmlGuiWindow::saveWindowSize(group); | |||
KDialog::saveDialogSize(group); | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
KWindowConfig::restoreWindowSize(windowHandle(), group); | |||
</source> | |||
and | |||
<source lang="cpp-qt"> | |||
KWindowConfig::saveWindowSize(windowHandle(), group); | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KVBox* const vbox = new KVBox(this); | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
KDcrawIface::RVBox* const vbox = new KDcrawIface::RVBox(this); | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KHBox* const hbox = new KHBox(this); | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
KDcrawIface::RHBox* const hbox = new KDcrawIface::RHBox(this); | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KIO::NetAccess::del(url, QApplication::activeWindow()); | |||
KIO::NetAccess::mkdir(url, QApplication::activeWindow()); | |||
KIO::NetAccess::dircopy(srcUrl, dstUrl, QApplication::activeWindow()) | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
auto deleteJob = KIO::file_delete(url); | |||
KJobWidgets::setWindow(deleteJob, QApplication::activeWindow()); | |||
deleteJob->exec(); | |||
auto mkdirJob = KIO::mkdir(url); | |||
KJobWidgets::setWindow(mkdirJob, QApplication::activeWindow()); | |||
mkdirJob->exec(); | |||
auto dircopyJob = KIO::copy(srcUrl, dstUrl); | |||
KJobWidgets::setWindow(dircopyJob, QApplication::activeWindow()); | |||
dircopyJob->exec(); | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KD::rename(src, dst) | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QFile::rename(src, dst) | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KToolInvocation::invokeBrowser(url) | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QDesktopServices::openUrl(url) | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KGlobalSettings::singleClick() | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
qApp->style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick) | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KUrl::directory(KUrl::ObeyTrailingSlash) | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QUrl url = adjusted(QUrl::RemoveFilename); | |||
url.adjusted(QUrl::StripTrailingSlash).path() | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KImageIO::typeForMime(str) | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QMimeDatabase().mimeTypeForName(str) | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KTemporaryFile temp; | |||
temp.setPrefix(prefixStr); | |||
temp.setSuffix(suffixStr); | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QTemporaryFile temp; | |||
temp.setFileTemplate(prefixStr + QLatin1String("XXXXXX") + suffixStr); | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
K_GLOBAL_STATIC | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
Q_GLOBAL_STATIC | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KMenu::addTitle() | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QMenu::addSection() | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KStandardDirs::locate("data", "file") | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QStandardPaths::locate(QStandardPaths::GenericDataLocation, "file") | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KStandardDirs::locateLocal("data", "file") | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) | |||
+ QChar('/') + QString("file") | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KStandardDirs::locateLocal("appdata", "file") | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QStandardPaths::writableLocation(QStandardPaths::DataLocation) | |||
+ QChar('/') + QString("file") | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KStandardDirs::locateLocal("cache", "file") | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) | |||
+ QChar('/') + QString("file") | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KStandardDirs::locateLocal("tmp", "file") | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QDir::tempPath() + QChar('/') + QString("file") | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KStandardDirs::makeDir(path, permission); | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
if (!QDir(path).exists()) | |||
{ | |||
if (QDir().mkpath(path)) | |||
{ | |||
QFile f(path); | |||
f.setPermissions(permission); | |||
} | |||
} | |||
</source> | |||
| | |||
permission = QFile::ReadUser | QFile::WriteUser | QFile::ExeUser = 0700 | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KUrlRequester | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
KDcrawIface::RFileSelector | |||
</source> | |||
| | |||
To select local only file or path, no need KUrlRequester. | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KActionMenu | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QMenu | |||
</source> | |||
| | |||
Use QMenu::menuAction() to get Action instance of menu to plug in action collection. | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
KToggleAction | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QAction | |||
</source> | |||
| | |||
Use QAction::setCheckable(true) to switch Action as toggle state. | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
QUrl url; | |||
url.addQueryItem(key, value); | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QUrl url; | |||
QUrlQuery q(url); | |||
q.addQueryItem(key, value); | |||
url.setQuery(q); | |||
</source> | |||
| | |||
|- | |||
| | |||
<source lang="cpp-qt"> | |||
QPixmap pix, alphaMask; | |||
pix.setAlphaChannel(mask); | |||
</source> | |||
| | |||
<source lang="cpp-qt"> | |||
QPixmap pix, alphaMask; | |||
QPainter p(&pix); | |||
p.setOpacity(0.2); | |||
p.drawPixmap(0, 0, alphaMask); | |||
p.end(); | |||
</source> | |||
| | | | ||
|} | |} | ||
Line 516: | Line 1,079: | ||
* [https://community.kde.org/Frameworks/Porting_Notes KDE4 to KF5 porting guide] | * [https://community.kde.org/Frameworks/Porting_Notes KDE4 to KF5 porting guide] | ||
* [http://api.kde.org/frameworks-api/frameworks5-apidocs/kdelibs4support/html/deprecated.html KDE4 deprecated list] | |||
* [http://api.kde.org/frameworks-api/frameworks5-apidocs/kdelibs4support/html/classKCalendarSystem.html#a6853ea0521ea23923d3a104b1a178782 KCalendarSystem format strings] to port to [http://doc.qt.io/qt-5/qdate.html#toString QDate format strings] and [http://doc.qt.io/qt-5/qtime.html#toString QTime format strings] | |||
* [https://community.kde.org/Frameworks/Porting_Notes/KStandardDirs KStandardDirs to Qt5 porting guide] | |||
* [http://api.kde.org/frameworks-api/frameworks5-apidocs/index.html KF5 API] | * [http://api.kde.org/frameworks-api/frameworks5-apidocs/index.html KF5 API] | ||
Line 523: | Line 1,092: | ||
* [http://qt-project.org/doc/qt-5/classes.html Qt5 API] | * [http://qt-project.org/doc/qt-5/classes.html Qt5 API] | ||
* [https://projects.kde.org/projects/ | * [https://projects.kde.org/projects/qt5?jump=repository Qt5 project] | ||
* [http://api.kde.org/ecm/index.html ECM - Documentation] | * [http://api.kde.org/ecm/index.html ECM - Documentation] | ||
* [https://techbase.kde.org/Development/ECM_SourceIncompatChanges ECM - KDELibs4 macro port] | |||
* [https://projects.kde.org/projects/kdesupport/extra-cmake-modules ECM - Extra CMake Module project] | |||
=== Scripts to port code === | === Scripts to port code === | ||
Line 564: | Line 1,137: | ||
** clean-includes.sh (try to remove not used includes, not safe to 100%) | ** clean-includes.sh (try to remove not used includes, not safe to 100%) | ||
** port_to_autogenerate_export_header.sh (convert to new signal/slot API, not safe to 100%) | ** port_to_autogenerate_export_header.sh (convert to new signal/slot API, not safe to 100%) | ||
Latest revision as of 17:45, 18 March 2016
KDE Framework Port
Branches Creation
All port code must be stored in dedicated "frameworks" git branch for each project. Branch must be created from master.
$>git checkout master
$>git pull --rebase
$>git checkout -b frameworks
$>git push origin frameworks:frameworks
$>git branch -a
* frameworks
master
remotes/origin/HEAD -> origin/master
remotes/origin/frameworks
remotes/origin/master
KF5 Repositories list is given below :
Kipi-plugins Refactoring
A lots of tools are not maintained since a while, other one have been never finalized. See the list of plugins which will be ported or not :
- Tools which can be ported as well :
- panorama
- expoblending
- gpssync
- sendimages
- timeadjust
- metadataedit
- videoslideshow
- advancedslideshow
- flashexport
- kmlexport
- acquireimages
- calendar
- dngconverter
- printimages
- imageviewer
- Tools in pending stage :
- dlnaexport <=== Needs HUpnp lib Qt5 port
- htmlexport <=== Nobody maintain this code since a while, but tool still used.
- photolayoutseditor <=== A complex but powerful tool. Will be complex to port.
- removeredeyes <=== We can share red eyes removal core implementation in libkface in way to share with other KDE applications and replace digiKam Image Editor tool by this code. A new digiKam BQM tool must be created. A GSoC 2015 project can be planned about this topic.
- Web export tools which must be factored (same settings widgets, common dialog, common high level interface to process import/export). Another GSoC 2015 project can be planned about this topic.
- picasawebexport
- rajceexport
- shwup
- debianscreenshots
- dropbox
- googledrive
- imageshackexport
- kioexportimport
- piwigoexport
- smug
- flickrexport
- yandexfotki
- mediawiki <=== need to port libmediawiki from extragear/libs/.
- vkontakte <=== require libkvkontakte from extragear/libs/.
- Tools never finalized (can be moved to attic for the moment) :
- imgurexport <=== require libqtkoauth from SF.net
- photivointegration
- jalbumexport
- wallpaper
- Tools obsolete (can be moved to attic for the moment) :
- batchprocessimages <=== replaced by digiKam BQM
- rawconverter <=== replaced by digiKam BQM
- jpeglossless <=== replaced by new digiKam core tool
- kopete <=== KF5 will use new API
- ipodexport <=== work only with very old Apple devices.
- galleryexport <=== Gallery web service is not maintained since a while. Gallery project is dead.
KF5/Qt5 Port Status
Libkexiv2
Component | Cmake port | pure Qt5 port | pure KF5 port | compile | warnings | Who | Remarks |
---|---|---|---|---|---|---|---|
libkexiv2/src | done | done | done | yes | no | Gilles, Laurent |
|
libkexiv2/tests | done | done | done | yes | no | Gilles, Laurent | Code do not depend of KF5 |
Libkdcraw
Component | Cmake port | pure Qt5 port | pure KF5 port | compile | warnings | Who | Remarks |
---|---|---|---|---|---|---|---|
libkdcraw/src | done | done | done | yes | no | Gilles, Laurent, Veaceslav |
|
libkdcraw/tests | done | done | done | yes | no | Gilles, Laurent, Veaceslav |
|
Libkipi
Component | Cmake port | pure Qt5 port | pure KF5 port | compile | warnings | Who | Remarks |
---|---|---|---|---|---|---|---|
libkipi/src | done | done | done | yes | no | Gilles, Laurent, Mohamed |
|
libkipi/test | done | done | done | yes | no | Gilles, Laurent, Mohamed |
|
Libkface
Component | Cmake port | pure Qt5 port | pure KF5 port | compile | warnings | Who | Remarks |
---|---|---|---|---|---|---|---|
libkface/src | done | done | done | yes | no | Gilles, Laurent, Teemu | Library only depend of KF5::I18n |
libkface/tests | done | done | done | yes | no | Gilles, Laurent, Teemu | Code do not depend of KF5 |
Libkgeomap
Component | Cmake port | pure Qt5 port | pure KF5 port | compile | warnings | Who | Remarks |
---|---|---|---|---|---|---|---|
libkgeomap/src | done | done | done | yes | no | Gilles, Laurent, Teemu, Mohamed |
|
libkgeomap/tests | done | done | done | yes | no | Gilles, Laurent, Teemu | |
libkgeomap/calibrator | done | done | done | yes | no | Gilles, Laurent, Teemu | |
libkgeomap/demo | done | done | done | yes | no | Gilles, Laurent, Teemu |
|
Kipi-plugins
Component | Cmake port | pure Qt5 port | pure KF5 port | compile | warnings | Who | Remarks |
---|---|---|---|---|---|---|---|
Kipi-plugins/common | done | uncomplete | uncomplete | yes | yes | Gilles, Laurent |
|
Kipi-plugins/tests | done | uncomplete | uncomplete | yes | no | Gilles, Laurent | |
Kipi-plugins Documentation | done | not applicable | not applicable | yes | no | Gilles | |
Kipi-plugins/timeadjust | done | uncomplete | uncomplete | yes | no | Gilles, Laurent | |
Kipi-plugins/sendimages | done | uncomplete | uncomplete | yes | no | Gilles, Laurent | |
Kipi-plugins/kmlexport | done | uncomplete | uncomplete | yes | no | Gilles, Laurent | |
Kipi-plugins/printimages | done | uncomplete | uncomplete | yes | no | Gilles, Laurent | Postscript support have been removed from QPrinter. Option is now removed from assistant. |
Kipi-plugins/flashexport | done | uncomplete | uncomplete | yes | no | Gilles, Laurent |
digiKam Software Compilation
Component | Cmake port | pure Qt5 port | pure KF5 port | compile | warnings | Who | Remarks |
---|---|---|---|---|---|---|---|
digiKam Software Compilation | done | not applicable | not applicable | not applicable | not applicable | Gilles |
|
digiKam Documentation | done | not applicable | not applicable | yes | no | Gilles |
digiKam Core
Component | Cmake port | pure Qt5 port | pure KF5 port | compile | warnings | Who | Remarks |
---|---|---|---|---|---|---|---|
digiKam/data | done | not applicable | not applicable | yes | no | Gilles, Laurent | |
digiKam/libs | done | done | done | yes | no | Gilles, Laurent, Teemu, Alin, Veaceslav |
|
digiKam/app | done | done | done | yes | no | Gilles, Laurent, Teemu, Alin |
|
digiKam/utilities | done | done | done | yes | no | Gilles, Laurent, Teemu, Alin, Mohamed |
|
digiKam/imageplugins | done | done | done | yes | no | Gilles, Laurent, Teemu |
|
digiKam/kioslave | done | done | done | yes | no | Gilles, Laurent, Teemu |
|
digiKam/showfoto | done | done | done | yes | no | Gilles, Laurent, Teemu | |
digiKam/databaseserver | done | done | done | yes | no | Gilles, Laurent, Teemu | |
digiKam/tests | done | done | done | yes | no | Gilles, Laurent, Teemu |
|
Recommendations
Porting to KF5 is divided in 4 stages:
1/ Change CMake files. Some Laurent scripts do this stuff. We use now ECM scripts collection from KDE core to manage dependencies and report on the console. Some macros disappear, and are replaced by new ones. For this job, it's recommended to look well all done in CMake files from libkexiv2 and libkdcraw already ported and polished.
2/ Port C++ code using KDE4Support. This include older classes from Qt4 and KDE4 to make transition faster. This will help to have quickly a code compilable, but this will generate a lots of deprecated warnings. First regression tests must be done at this stage to see if nothing is broken.
3/ Port C++ code to pure KF5. The goal of KF5 is to reduce KDELibs fingerprint everywhere, when it's possible. Qt API will be used in priority against KF5 API. But sometime, this will be not possible as well, without big changes. A lot of KDE API have migrated to Qt5 (as for ex : KUrl -> QUrl and kDebug ->qDebug). It's sound like KDELibs will become an incubator for new implementations which will move later to Qt. Also, to have the most of code using pure Qt5 will simplify future transitions more easy to do. Removing KDE4Support dependency will force to use non-deprecated KF5 API.
4/ Port C++ code to pure Qt5. Porting most of KF5 Api to use Qt5 instead is prefered, when it's possible. Another important change in Qt5 is the non-support of char pointer with QString.
In first stage we must use remove_definitions(-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII) in CMake script to compile code. These definitions force to not use deprecated QString methods.
Another definition to add while Qt5 porting is add_definitions(-DQT_NO_URL_CAST_FROM_STRING) about cast between QString and QUrl.
In last stage we must use remove_definition(-DQT_DEPRECATED_SINCE(5,0)) in CMake script to compile code. These definitions force to disable deprecated methods in Qt API.
Common changes to port code
Original Code | Ported Code | Remarks |
---|---|---|
...section of code not yet ported... |
#pragma message("PORT QT5")
/*
...section of code not yet ported...
*/ |
Not yet ported code sections must be commented with compiler warnings printed on the console |
KDE4_BUILD_TESTS=ON | BUILD_TESTING=ON | CMake flag to build tests sub-dir. |
CMAKE_BUILD_TYPE=debugfull | CMAKE_BUILD_TYPE=debug | CMake flag to build code with debug symbols. |
kDebug() / kWarning() / kError() | qCDebug(FOO_LOG) / qCWarning(FOO_LOG) / qCCritical(FOO_LOG) |
|
#include "foo.moc" |
#include "foo.h" |
|
KUrl::directory() |
QUrl::adjusted(QUrl::RemoveFilename).path() |
|
KDiskFreeSpaceInfo |
QStorageInfo |
|
KUrl::setFileName(newFileName) |
QUrl::setPath(QUrl::path() + newFileName) |
|
KUrl url;
url.adjustPath(KUrl::AddTrailingSlash); |
QUrl url;
url.setPath(url.path() + '/'); |
|
KDialog::spacingHint() |
QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing) |
|
KDialog::marginHint() |
QApplication::style()->pixelMetric(QStyle::PM_DefaultChildMargin) |
|
KComponentData::mainComponent().componentName() |
QApplication::applicationName() |
|
KComponentData::mainComponent().aboutData()->homepage() |
KAboutData::applicationData().homepage() |
|
KIconLoader::SmallIcon("icon_name", size) or KIconLoader::global()->loadIcon("icon_name", size) |
QIcon::fromTheme("icon_name").pixmap(size) |
|
KStandardDirs::installPath("data") + QString("filename") |
QStandardPaths::locate(QStandardPaths::GenericDataLocation,
QString("filename")) |
File to open in read-only. File already exist. |
KStandardDirs::installPath("xdgdata-apps") + QString("filename") |
QStandardPaths::locate(QStandardPaths::ApplicationsLocation,
QString("filename")) |
File to open in read-only. File already exist. |
KStandardDirs::locateLocal("data", QString("filename")) |
QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)
+ '/' + QString("filename") |
File to open in read-only. File already exist. |
QString dir = KStandardDirs::locateLocal("data",
QString("dirname"), true) |
QString dir =
QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)
+ '/' + QString("dirname");
QDir().mkpath(dir); |
Dir to open in read-write. Create dir if it do not exist. |
KUrlLabel |
KDcrawIface::RActiveLabel |
|
KSeparator |
KDcrawIface::RLineWidget |
|
KXmlGuiWindow::restoreWindowSize(group);
KDialog::restoreDialogSize(group); and KXmlGuiWindow::saveWindowSize(group);
KDialog::saveDialogSize(group); |
KWindowConfig::restoreWindowSize(windowHandle(), group); and KWindowConfig::saveWindowSize(windowHandle(), group); |
|
KVBox* const vbox = new KVBox(this); |
KDcrawIface::RVBox* const vbox = new KDcrawIface::RVBox(this); |
|
KHBox* const hbox = new KHBox(this); |
KDcrawIface::RHBox* const hbox = new KDcrawIface::RHBox(this); |
|
KIO::NetAccess::del(url, QApplication::activeWindow());
KIO::NetAccess::mkdir(url, QApplication::activeWindow());
KIO::NetAccess::dircopy(srcUrl, dstUrl, QApplication::activeWindow()) |
auto deleteJob = KIO::file_delete(url);
KJobWidgets::setWindow(deleteJob, QApplication::activeWindow());
deleteJob->exec();
auto mkdirJob = KIO::mkdir(url);
KJobWidgets::setWindow(mkdirJob, QApplication::activeWindow());
mkdirJob->exec();
auto dircopyJob = KIO::copy(srcUrl, dstUrl);
KJobWidgets::setWindow(dircopyJob, QApplication::activeWindow());
dircopyJob->exec(); |
|
KD::rename(src, dst) |
QFile::rename(src, dst) |
|
KToolInvocation::invokeBrowser(url) |
QDesktopServices::openUrl(url) |
|
KGlobalSettings::singleClick() |
qApp->style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick) |
|
KUrl::directory(KUrl::ObeyTrailingSlash) |
QUrl url = adjusted(QUrl::RemoveFilename);
url.adjusted(QUrl::StripTrailingSlash).path() |
|
KImageIO::typeForMime(str) |
QMimeDatabase().mimeTypeForName(str) |
|
KTemporaryFile temp;
temp.setPrefix(prefixStr);
temp.setSuffix(suffixStr); |
QTemporaryFile temp;
temp.setFileTemplate(prefixStr + QLatin1String("XXXXXX") + suffixStr); |
|
K_GLOBAL_STATIC |
Q_GLOBAL_STATIC |
|
KMenu::addTitle() |
QMenu::addSection() |
|
KStandardDirs::locate("data", "file") |
QStandardPaths::locate(QStandardPaths::GenericDataLocation, "file") |
|
KStandardDirs::locateLocal("data", "file") |
QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)
+ QChar('/') + QString("file") |
|
KStandardDirs::locateLocal("appdata", "file") |
QStandardPaths::writableLocation(QStandardPaths::DataLocation)
+ QChar('/') + QString("file") |
|
KStandardDirs::locateLocal("cache", "file") |
QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)
+ QChar('/') + QString("file") |
|
KStandardDirs::locateLocal("tmp", "file") |
QDir::tempPath() + QChar('/') + QString("file") |
|
KStandardDirs::makeDir(path, permission); |
if (!QDir(path).exists())
{
if (QDir().mkpath(path))
{
QFile f(path);
f.setPermissions(permission);
}
} |
permission = QFile::ReadUser | QFile::WriteUser | QFile::ExeUser = 0700 |
KUrlRequester |
KDcrawIface::RFileSelector |
To select local only file or path, no need KUrlRequester. |
KActionMenu |
QMenu |
Use QMenu::menuAction() to get Action instance of menu to plug in action collection. |
KToggleAction |
QAction |
Use QAction::setCheckable(true) to switch Action as toggle state. |
QUrl url;
url.addQueryItem(key, value); |
QUrl url;
QUrlQuery q(url);
q.addQueryItem(key, value);
url.setQuery(q); |
|
QPixmap pix, alphaMask;
pix.setAlphaChannel(mask); |
QPixmap pix, alphaMask;
QPainter p(&pix);
p.setOpacity(0.2);
p.drawPixmap(0, 0, alphaMask);
p.end(); |
Link to documentation to port code
Scripts to port code
Laurent Montel has written scripts to port CMake and C++ code to KF5/Qt5 and remove kdelibs4support dependency. There are available in this repository (see kf5 sub-dir).
Scripts must be applied in this order, with a test compilation between each one :
- Full safe scripts :
- convert-to-k4aboutdata.pl (first one to apply, this help to compile)
- adapt_cmakelists_file.pl (to convert CMake scripts, but code must don't be capititalized)
- remove-kde4support.pl
- convert-kicon.pl
- convert-kmenu.pl
- convert-kshortcut.pl
- convert-kcolordialog.pl
- convert-klistwidget.pl
- convert-kmd5.pl
- convert-kmenubar.pl
- convert-ksplashscreen.pl
- convert-kdebug.pl
- Less safe scripts :
- convert-kintnuminput.pl
- convert-kintspinbox.pl
- convert-ktextbrowser.pl
- convert-kfontcombobox.pl
- Scripts which need to check in-deep all changes :
- convert-kvbox.pl
- convert-kdialog.pl
- convert-kcmdlineargs.pl
- convert-kdebug-with-argument.sh (this one change kDebug(1556) en qCDebug with some info after to convert)
- convert-kmimetype.pl
- Last scripts to apply :
- clean-forward-declaration.sh (remove forward declaration, to do when all compile fine)
- clean-includes.sh (try to remove not used includes, not safe to 100%)
- port_to_autogenerate_export_header.sh (convert to new signal/slot API, not safe to 100%)