Sophie

Sophie

distrib > Fedora > 17 > i386 > by-pkgid > edc3fd4cb0c6aaa9ece3b38ece7889da > files > 2019

kdelibs-devel-4.10.5-1.fc17.i686.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Guide to Porting Applications to KDE 4.x</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
<!--
body {
    font-size: 0.8em;
    font-family: "Bitstream Vera Sans", "Lucida Grande", "Trebuchet MS", sans-serif;
    color: #535353;
    background-color: #ffffff;
}

h1, h2, h3, h4, h5 {
    font-weight: bold;
    color: #f7800a;
}

a:link {
    padding-bottom: 0;
    text-decoration: none;
    color: #0057ae;
}

a:visited {
    padding-bottom: 0;
    text-decoration: none;
    color: #644A9B;
}

a[href]:hover {
    text-decoration: underline;
}

pre {
    display: block;
    margin: 0.3em;
    padding: 0.3em;
    font-size: 1em;
    font-family: Courier, 'Courier New', 'Andale Mono', Monaco, monospace;
    color: #000000;
    background: #f9f9f9;
    border: #2f6fab dashed;
    border-width: 1px;
    overflow: auto;
    line-height: 1.1em;
}
-->
</style>
</head>
<body>
<h1>Porting Applications to KDE 4</h1>

<h2>Note</h2>
<p>All modules should build from /trunk/KDE/kdelibs; there is no snapshot branch any longer. Major changes happen on Mondays (in any timezone) so expect rapid changes during that time. Things should be generally stable otherwise, but this <b>is</b> the development area, so there are no guarantees.</p>

<p>Deprecated classed that have been renamed to e.g. K3Foo are in kde3support.</p>

<p>This document contains the changes you have to apply to programs written for
KDE 3.x when you want to port them to KDE 4.x.<br>

<h3><a name="TOC">Table of Contents</a></h3>

<UL>
<li><a href="#gettingstarted">Getting Started</a></li>
<li><a href="#globalchanges">Global Changes</a></li>
<li><a href="#kab">Changes in kab</a></li>
<li><a href="#kdefx">kdefx porting (kdefx has been removed)</a></li>
<li><a href="#kdecore">Changes in kdecore</a></li>
<li><a href="#kdeui">Changes in kdeui</a></li>
<li><a href="#kio">Changes in kio</a></li>
<li><a href="#kparts">Changes in kparts</a></li>
<li><a href="#kded">Changes in kded</a></li>
<li><a href="#kspell">Changes in kspell</a></li>
<li><a href="#kdnssd">Changes in kdnssd</a></li>
<li><a href="#khtmlpart">API-cleanup in KHTML</a></li>
<li><a href="#kfile">Changes in kfile</a></li>
<li><a href="#kdesu">Changes in kdesu</a></li>
<li><a href="#kcontrol">KDE Control Center</a></li>
<li><a href="#kicker">Panel Applets and Extensions</a></li>
<li><a href="#kscreensaver">KScreensaver</a></li>
<li><a href="#i18n">I18N</a></li>
<li><a href="#kssl">KSSL</a></li>
<li><a href="#mimetypes">Mime types names</a></li>
<li><a href="#knewstuff">KNewStuff</a></li>
<li><a href="#dcop">DCOP</a></li>
<li><a href="#printing">Printing</a></li>
</UL>

<h3><a name="gettingstarted">Getting started</a></h3>

<p>As a start you should have a look at doc/html/porting4.html in the Qt package,
or <a href="http://doc.trolltech.com/4.3/porting4.html">this page online</a>.</p>

<p>To start with the porting, you can run "qt3to4 -strict list_of_files"
followed by kdesdk/scripts/qt4/adapt-to-qt4-api.pl and kdesdk/scripts/qt4/adapt-to-kde4-api.pl</p>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="globalchanges">Global Changes</a></h3>
<ul>
<li>
The "const char *name" arguments in the constructors of QObject derived classes
have been removed. Use setObjectName() instead if the object name is really necessary.
</li>
<li>The define KDE_DEPRECATED must be used now at the start of the declaration
(but still after an eventual "static", "inline" or "virtual" keyword).
KDE_DEPRECATED does not work with constructors, use KDE_CONSTRUCTOR_DEPRECATED
instead.</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>


<h3><a name="kab">Changes in kab</a></h3>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kdefx">Changes in kdefx</a></h3>

<p>kdefx has been removed.</p>

<ul>
<li>KStyle moved to kdeui</li>
<li>Use Solid::Processor instead of KCPUInfo.</li>
<li>Most of KImageEffect is now available in blitz; the bits that aren't can be done with QPainter.
<ul>
<li>Qt has gradients now, please use them if you can. Otherwise blitz has gradients ala KImageEffect.</li>
</ul>
</li>
<li>KPixmapEffect was little more than a wrapper around pixmap-&gt;image-&gt;KImageEffect-&gt;image-&gt;pixmap. Use the replacements for KImageEffect.</li>
<li>kdrawutils.h is gone.
<ul>
<li>If you already ported your code to KDE4, your code now has a copy of whatever kdrawutil code you were using.</li>
<li>If you haven't ported your code yet, you get to find a copy of what you need in svn's revision history (or in branches/3.5).</li>
</ul>
</li>
<li>The functionality of KPixmapSplitter cen be emulated with this code, courtesy of Matt Newell:
<pre>
QRect getFlowedRect(int index, const QSize &amp;itemSize,
                    int layoutWidth, int h_spacing, int v_spacing)
{
    // NOTE: if using h_spacing, depending on your use you might want to replace
    // layoutWidth with (layoutWidth + h_spacing)
    int itemsPerRow = layoutWidth / (itemSize.width() + h_spacing);
    return QRect( QPoint( (index % itemsPerRow) * (itemSize.width() + h_spacing),
                          (index / itemsPerRow) * (itemSize.height() + v_spacing) ),
                  itemSize );
}
</pre>
</li>
<li>Use QPixmap instead of KPixmap.</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kdecore">Changes in kdecore</a></h3>

<ul>
<li>kuniqueapp.h =&gt; kuniqueapplication.h</li>
<li>klargefile.h =&gt; kde_file.h</li>
<li>kcatalogue.h =&gt; kcatalog.h</li>
<li>kaccelmanager.h =&gt; kacceleratormanager.h</li>
<li>kprocctrl.h =&gt; k3protocolcontroller.h</li>
<li>KInstance was renamed to KComponentData</li>
<li>KGlobalAccel moved to kdeui</li>
<li>KGlobalSettings moved to kdeui</li>
<li>KIconLoaded moved to kdeui</li>
<li>KSessionManaged renamed to KSessionManager and moved to kdeui</li>
<li>KShortcut moved to kdeui</li>
</ul>

<h4>KAboutData</h4>
<ul>
<li>KAboutData::setTranslator needs different parameters now.
(Please see the corresponding Doxygen comment for the current state.)</li>
<li>new catalogName parameter to constructor can be null or empty, then appName is used as catalog name</li>
<li>all setter methods return object reference, so they can be chained to avoid repeating object name (eg. for addAuthor(), addCredits(), etc.)</li>
</ul>
<p>I18N_NOOPs in general replaced with KLocalizedString, produced by ki18n()/ki18nc() calls,
or just KLocalizedString() if wanted empty.
See also <a href="#i18n">the I18N section below</a>.</p>

<h4>KAccel</h4>
<p>Removed. Replaced by the new KAction/QAction framework.
See KActionCollection::associateWidget() if you need the old KAccel widget-binding behavior.</p>

<h4>KAccelAction</h4>
<ul>
<li>Removed. Replaced by the new KAction/QAction framework.</li>
<li>[Old note] KDE3 supported 3 modifier key shortcuts and 4 modifier key (3+META) shortcuts, because earlier versions of Qt3 didn't
    support a META modifier/WIN key.  This is changed, so now all shortcuts can be 4 modifier key.  All instances of
    shortcut3 and shortcut4 have been reduced just to "shortcut".</li>
<li>[Old note] The constructor, init(), and insert() functions now only take only KShortcut "default" argument instead of two</li>
<li>[Old note] Removed shortcutDefault3() and shortcutDefault4().  Use shortcutDefault() instead</li>
</ul>

<h4>KAccelBase</h4>
<p>Removed. Replaced by the new KAction/QAction framework.</p>

<h4>KApplication</h4>
<ul>
<li>Moved to kdeui. This means no change for GUI applications.
For text-based applications, you should consider switching to QCoreApplication + KComponentData.
There are two cases:
<ul>
	<li>Command-line argument parsing needed: use KCmdLineArgs as usual and then
	<pre>QCoreApplication app( KCmdLineArgs::qtArgc(), KCmdLineArgs::qtArgv() );</pre></li>
	<li>No command-line argument parsing needed: simply create a KComponentData (with &amp;aboutData or just a name),
	and then use <pre>QCoreApplication app( argc, argv );</pre>
	</li>
</ul>
<li>Of course if you don't create a KApplication, then you should turn any "kapp-&gt;" into "qApp-&gt;" in the
rest of the code.</li>
<li>KApplication does not inherit KInstance/KComponentData anymore. The KComponentData object is
available through KGlobal::mainComponent() (if KApplication is the first object to create a
KComponentData object, but everything else probably is a bug).</li>
<li>caption() was moved to KGlobal; you can now use it if you don't have a KApplication object</li>
<li>makeStdCaption() was moved to KDialog::makeStandardCaption()</li>
</ul>
<ul>
<li>isRestored() should now use qApp-&gt;isSessionRestored().  </li>
<li>keyboardMouseState() has been removed, its functionality is now provided by QApplication::keyboardModifiers() and QApplication::mouseButtons() </li>
<li>random() has been moved to the KRandom class </li>
<li>For using the kiosk restriction/authorization system you have to use the functions provided in KAuthorized.  </li>
<li>invoke* functions have been moved to ktoolinvocation. there are static methods invoke*, if you want to use slots as before connect to the invoke* slots of KToolInvocation::self() </li>
<li>startService*, kdeinitExec* have been moved to KToolInvocation </li>
<li>static void addCmdLineOptions(); has moved to KCmdLineArgs::addStdCmdLineOptions </li>
<li>getDisplay() has been removed, its functionality is now provided by QX11Info::display() </li>
<li>cut(), copy(), paste(), clear() and selectAll() were moved to KStandardAction.  Rather than creating a copy action and connecting it to kapp just use the KStandardAction::copy </li>
<li>guiEnabled() was removed, use QApplication::type() instead.  </li>
<li>ref()/deref() was moved to KGlobal (as static methods) </li>
<li>geometryArgument was removed, please use:
    <pre>
     QString geometry;
     KCmdLineArgs *args = KCmdLineArgs::parsedArgs("kde");
     if (args &amp;&amp; args-&gt;isSet("geometry"))
        geometry = args-&gt;getOption("geometry");
    </pre>
</li>
<li>installSigpipeHandler() was removed.  </li>
<li>propagateSessionManager(), requestShutDown() methods and associated ShutdownConfirm, ShutdownType and ShutdownMode enums have been moved into the kworkspace library (which is found in kdebase/workspace/lib); the methods are static functions in KWorkspace namespace. </li>
<li>The shutDown() signal has been removed, use QApplication's signal aboutToQuit() </li>
<li>enableStyles(), disableStyles(), and the constructor argument has been removed.  </li>
<li>installKDEPropertyMap has been moved into k3sqlpropertymap.h and renamed to kInstallKDEPropertyMap. It can be used to keep old c
ode that uses the Q3Data* classes working.For new code, use User in the meta object to determine which Q_PROPERTY to use for any widget.
    <pre>
      const QMetaObject *metaObject = widget-&gt;metaObject();
      for (int i = 0; i &lt; metaObject-&gt;propertyCount(); ++i) {
        const QMetaProperty metaProperty = metaObject-&gt;property(i);
        if (metaProperty.isUser()) {
          QString propertyToUse = metaProperty.name();
          break;
        }
      }
    </pre>
</li>
<li>caption() has moved to KComponentData </li>
<li>makeStdCaption(const QString&amp;, bool, bool) has moved to KDialog and changed signature to makeStdCaption(const QString&amp;, CaptionFlags) </li>
<li>addKipcEventMask() is unneeded now, and the signals like settingsChanged(), fontChanged() etc. with enums SettingsCategory have moved to KGlobalSettings::self() which is now a QObject</li>
<li>updateRemoteUserTimestamp() now takes DBUS service id instead of dbus name (i.e. something like org.kde. needs to be prepended)</li>
</ul>

<h4>KAudioPlayer</h4>
<p>Removed, use now Phonon::AudioPlayer</p>

<h4>KCatalogue</h4>
<p>Renamed to KCatalog. Method name parts with "catalogue" have been renamed to use "catalog" instead.</p>

<h4>KCharsets</h4>
<ul>
<li>KCharsets::codecForName cannot use glibc's i18n data anymore.
(Note: this feature was new in KDE 3.5 but never publicly announced.)</li>
<li>The user-visible encoding names are now mostly upper-case
(instead of being always lower-case).</li>
<li>KCharsets::languageForEncoding should be replaced
by KCharsets::descriptionForEncoding. The function KCharsets::languageForEncoding is planned to be removed before the release of KDE4.</li>
<li>The status of the encoding UTF-7 is not guaranteed to be kept, as Qt
does not support this encoding.</li>
<li><b>TODO</b>: see which member functions can be removed. The functions handling entites are planned to be moved out of the class KCharsets.</li>
</ul>

<h4>KCodecs</h4>
<ul>
<li>All methods using a QCString removed. The methods use QByteArray now. </li>
<li>Header renamed to kcodecs.h</li>
</ul>

<h4>KConfigBackend</h4>
<ul>
<li>Removed filename(), use fileName()</li>
</ul>

<h4>KSimpleConfig</h4>
<p>This class was removed. It was a very thin wrapper around KConfig and should
be replaced.</p>
<ul>
<li>If you use an absolute path, just change KSimpleConfig with KConfig - there was
no difference between uses of them for KDE3 either.</li>
<li>If you want just the local file to open replace KSimpleConfig("file") with
KConfig("file", KConfig::SimpleConfig);</li>
</ul>

<h4>KConfig</h4>
<ul>
<li>setGroup is deprecated as it creates state. Use group(QString) to receive
 a KConfigGroup object or create a KConfigGroup object yourself:
<pre>
KConfig *config = KGlobal::config();
config-&gt;setGroup("Group");
config-&gt;writeEntry("Key", 0);
</pre>
should be rewritten as
<pre>
KConfigGroup config = KGlobal::config()-&gt;group("Group");
config.writeEntry("Key", 0);
</pre>
</li>
<li>setDesktopGroup is gone. Use KDesktopFile (and its desktopGroup() method) if
you want to read .desktop files - or use group("Desktop Entry") instead</li>
<li>It's no longer necessary to specify a KConfig object is read-only - they are always
unless you use change it</li>
<li>The KConfig constructors were changed to receive flags instead of boolean values, i.e.
  <ul>
    <li><tt>KConfig("file", false /* read-write */, false /* no globals */);</tt> becomes
            <tt>KConfig("file", KConfig::NoGlobals);</tt> (note the read-write flag is gone)</li>
     <li><tt>KConfig("file", true);</tt>becomes <tt>KConfig("file");</tt></li>
  </ul>
</li>
</ul>

<h4>KConfigBase</h4>
<ul>
<li>all read*Entry methods deprecated, use <b>template &lt;typename T&gt; readEntry(key, const T&amp;)</b> in KConfigGroup instead.
This uses QVariant in the background so only types that QVariant can convert to QString work. The use of QVariant allows some ambiguous conversions, so it might be necessary to use <em>explicit</em> construction to disambiguate the type wanted, i.e.
 <ul>
     <li>bool var = readEntry(key, <b>false</b>);</li>
     <li>int var = readEntry(key, <b>int(SomeEnumValue)</b>);</li>
     <li>QColor var = readEntry(key, QColor(<b>Qt::black</b>)); // no conversion from Qt::GlobalColor to QVariant
     <li>long var = readEntry(key, <b>0</b>); // conversion from long to QVariant is ambiguous, so can't use <b>long(0)</b>.</li>
 </ul>
If you need to access top-level config entries (those without any group), use KConfigGroup with the group name <i>&lt;default&gt;</i>.
</li>
<li>readEntry(const QString&amp;, const QString&amp;) no longer has a default argument, add QString() as
second argument.
</li>
<li>all writeEntry* methods removed, mostly not noticeable, but some types don't automatically convert
to QVariant. You need to cast to a type that is directly convertible to QVariant. i.e.
<pre>
time_t timeVal;
group.writeEntry("someKey", timeVal); // ambiguous conversion
group.writeEntry("someKey", int(timeVal)); // ok
</pre>
</li>
<li>all read*ListEntry methods deprecated, renamed to KConfigGroup::readEntry. Most types use the template version.<br/>
<b>template &lt;typename T&gt; readEntry(key, const QList&lt;T&gt;&amp;)</b><br/>If you just write group.readEntry(key, list) it should work for any type that QVariant can convert to QString.
</li>
<li>writeEntry, deleteGroup, and deleteEntry do not take several boolean options (persistent,global,localized) anymore, but instead one QFlags</li>
</ul>

<h4>KConfigGroupSaver</h4>
<p>
The class KConfigGroupSaver has been removed, instead use KConfigGroup. The
difference is a KConfigGroupSaver object directly affects the config object it
is acting on, while a KConfigGroup object only ensures the entries read or
written through it are in the correct group.</p>
Instead of:
<pre>
KConfig *config = KGlobal::config();
KConfigGroupSaver saver(config, "group name");
  ...
config-&gt;readXXX("entry name");
</pre>
should be rewritten as:
<pre>
KConfigGroup cg = KGlobal::config()-&gt;group("group name");
  ...
cg.readXXX("entry name");
</pre>

<h4>KCmdLineArgs</h4>
<ul>
<li>   static void init(int _argc, char **_argv, const char *_appname, const char *_description, const char *_version, bool noKApp = false) KDE_DEPRECATED; -&gt; static void init(int _argc, char **_argv, const QByteArray &amp;appname, const QByteArray &amp;catalog, const KLocalizedString &amp;programName, const QByteArray &amp;version, const KLocalizedString &amp;description = KLocalizedString(), StdCmdLineArgs stdargs=StdCmdLineArgs(CmdLineArgQt|CmdLineArgKDE)));
<li> noKApp parameter is gone, instead:   Q_FLAGS(StdCmdLineArgs)</li>
<li> new catalog parameter can be null or empty, then appname is used as catalog name</li>
<li> KLocalizedString objects produced by ki18n()/ki18nc() calls (instead of previous I18N_NOOPs), or just KLocalizedString() if needed empty</li>
<li> static void usage(const QString &amp;error) -&gt; static void usageError(const QString &amp;error)</li>
</ul>

<h4>KCmdLineOptions</h4>
Now a proper class, instead of statically initialized struct. Use add() method for adding options (option syntax same as before); add() returns object reference, so calls can be chained to avoid repeating variable name all the way.

<h4><a name="KComponentData">KComponentData</a> (was KInstance)</h4>
<ul>
<li>value based class using shared data: In KDE4 don't work with pointers to KComponentData anymore.
Internally it is reference counted and the data deleted when the last reference goes out of scope.</li>
<li>config() returns a KSharedConfigPtr</li>
<li>sharedConfig() was removed in favour of config()</li>
<li>iconLoader() was moved to KApplication</li>
<li>newIconLoader() was moved to KApplication</li>
</ul>

<h4>kdDebug/kdWarning/kdFatal</h4>
<p>These functions have been renamed to <code>kDebug</code>,
<code>kWarning</code>, <code>kFatal</code>, resp. They now print the
function info, so printing the function name by hand, or using
<code>k_funcinfo</code> is now deprecated. An <code>endl</code> is
performed implicitly. The type of stream used is now
<code>QDebug</code>.</p>

<p>Instead of repeating the debug area all over the place, define
<code>KDE_DEFAULT_DEBUG_AREA</code> instead:</p>
<pre>
- kdDebug( 1234 ) << k_funcinfo << "entered" << endl;
+ kDebug() << "entered";
</pre>
<p>And, in your <code>CMakeLists.txt</code>:</p>
<pre>
+ add_definitions( -DKDE_DEFAULT_DEBUG_AREA=1234 )
</pre>

<h4>KDesktopFile</h4>
<ul>
<li>QString filename() const -&gt; QString fileName() const</li>
<li>more standards compliant. See
<a href="http://www.freedesktop.org/Standards/desktop-entry-spec/latest">
Desktop Entry Spec</a>
 <ul>
  <li>.kdelnk files are no longer supported, rename to .desktop.</li>
  <li>deprecated header [KDE Desktop Entry], change to [Desktop Entry], using desktopGroup()</li>
  <li>type FSDev is no longer supported, change to FSDevice</li>
 </ul>
</li>
<li>Same as in KConfig: the use of readEntry() or writeEntry() on a KDesktopFile should
be replaced by readEntry/writeEntry on a KConfigGroup. By default the desktopGroup() of
the KDesktopFile was used, otherwise use group("another_group").</li>
</ul>

<h4>KExtendedSocket</h4>
<p>This class has been removed. See below on KNetwork::K*Socket.</p>

<h4>KFilterDev</h4>
<ul>
<li>device() -&gt; createDevice() to indicate that you must delete the device afterwards.</li>
</ul>

<h4>KGlobal</h4>
<ul>
<li>&quot;int kasciistricmp( const char *str1, const char *str2 )&quot; has been moved into kascii.h</li>
<li>&quot;KIconLoader* iconLoader()&quot; has been moved to KIconLoader::global()</li>
<li>instance() renamed to mainComponent()</li>
<li>activeInstance() renamed to activeComponent()</li>
<li>setActiveInstance() renamed to setActiveComponent()</li>
<li>static members _locale, _instance and so on are private now, if you want to get or set the
KLocale use locale()/setLocale()/hasLocale() and if you want to know whether a mainComponent is set use
hasMainComponent()</li>
<li>config() returns a KSharedConfig::Ptr now instead of KConfig*</li>
<li>sharedConfig() has been removed in favour of config()</li>
</ul>

<h4>KIcon</h4>
<p>Deprecated and renamed to K3Icon; replacement is KIcon in kdeui.</p>
<p><b>Note:</b> at the moment you have to keep using K3Icon as a namespace for states, groups, and contexts though.</p>

<h4>KInstance</h4>
<p>Renamed to <a href="#kcomponentdata">KComponentData</a></p>

<h4>KIPC</h4>
<p>Removed. Use KGlobalSettings::self()-&gt;emitChange() instead of KIPC::sendMessageAll().</p>

<h4>KKey</h4>
<p>Removed. Use plain ints as the Qt key code instead.</p>
<ul>
<li>When replacing KKey(QKeyEvent*), you need to OR the event-&gt;key() and event-&gt;modifiers() to get the replacement.</li>
<li>The QtWIN enum has been removed.  Use Qt::META or Qt::MetaModifier instead.</li>
<li>modFlagLabel() was removed, use either KKeyServer::modToStringUser(), or QKeySequence(Qt::yourmodifier).toString()</li>
</ul>


<h4>KKeyNative</h4>
<p>Removed. Use plain ints as the Qt key code instead.</p>

<h4>KKeySequence</h4>
<p>Removed. Use QKeySequence instead.
Note that QKeySequence expects multiple shortcuts to be separated by ", " (i.e. a comma then a space) in converting from text.</p>

<h4>KLibLoader</h4>
<ul>
<li>use KPluginLoader or KService::createInstance instead whenever possible</li>
<li>The resolve(const char* name) and symbol(const char* name) methods were merged and renamed to resolveSymbol</li>
<li>bool hasSymbol was removed, use resolveFunction instead</li>
<li>resolveFunction( const char* name ) was added which returns not a void* but a KLibrary::void_function_ptr which can be used as a void* would in boolean tests and for making subsequent function calls.</li>
</ul>

<h4>KLibFactory</h4>
<ul>
<li>renamed to KPluginFactory</li>
<li>create methods take a QVariantList instead of QStringList</li>
</ul>

<h4>KGenericFactory</h4>
<ul>
<li>use K_PLUGIN_FACTORY macro instead: this will require to change your plugin constructor from QStringList to QVariantList</li>
<li>instead of K_EXPORT_COMPONENT_FACTORY use K_EXPORT_PLUGIN (defined with KPluginLoader) which adds Qt and kdelibs version information that KPluginLoader uses to check the validity of the plugin.</li>
</ul>

<h4>KLocale</h4>
<ul>
<li> QString formatNumber(const QString &amp;numStr) const -&gt;   QString formatNumber(const QString &amp;numStr, bool round=true, int precision=2) const;</li>
<li> bool weekStartsMonday() const -&gt; int weekStartDay() const</li>
<li> QString monthName(int i, bool shortName = false) const -&gt; QString KCalendarSystem::monthName (int month, int year, bool shortName = false) const = 0; or QString KCalendarSystem::monthName (const QDate &amp; date, bool shortName = false ) const = 0;</li>
<li> QString weekDayName(int i, bool shortName = false) const -&gt; calendar()-&gt;weekDayName</li>
<li> QString monthNamePossessive(int i, bool shortName = false) const -&gt; calendar()-&gt;monthNamePossessive()</li>
<li> void setWeekStartsMonday(bool start) -&gt; setWeekStartDay</li>
<li> QString formatDate(const QDate&amp;, bool shortFormat = false) const -&gt; QString formatDate(const QDate&amp;, DateFormat = LongDate) const</li>
<li> QString formatDateTime(const QDateTime&amp;, bool shortFormat = true, bool includeSecs = false) const -&gt; QString formatDateTime(const QDateTime&amp;, DateFormat = ShortDate, bool includeSecs = false) const</li>
<li> languages() -&gt; languageList()</li>
<li> formatMoney(const QString &amp;numStr) -&gt;   QString formatMoney(double num, const QString &amp; currency = QString::null, int digits = -1) const;</li>
<li> charset() -&gt; gone</li>
<li> setCharset() -&gt; gone</li>
<li>removeCatalogue was renamed to removeCatalog</li>
<li>QStringList languagesTwoAlpha() -&gt; QStringList languageList()</li>
<li>QStringList allLanguagesTwoAlpha() -&gt; QStringList allLanguagesList()</li>
<li>QStringList allCountriesTwoAlpha() -&gt; QStringList allCountriesList()</li>
<li>QString twoAlphaToLanguageName(const QString &amp;language) -&gt; QString languageCodeToName(const QString &amp;language)</li>
<li>QString twoAlphaToCountryName(const QString &amp;country) -&gt; QString countryCodeToName(const QString &amp;country)</li>
</ul>
<p>See also <a href="#i18n">the I18N section below</a>.</p>

<h4>KMacroExpander</h4>
<ul>
<li>KMacroExpander now takes a QHash and not a QMap</li>
</ul>

<h4>KMimeSourceFactory</h4>
<p>KMimeSourceFactory was automatically instanciated by KApplication which allowed the use of "icon:name" in Qt richtext.
Q3MimeSourceFactory being in Qt3Support, and this feature being very rarely used, K3MimeSourceFactory isn't instanciated
automatically anymore, you need to call K3MimeSourceFactory::install() in your main if you still depend on this feature.</p>

<h4>KMultipleDrag</h4>
<p>KMultipleDrag is obsolete, use QMimeData directly to provide contents in different mime formats.</p>
<p>To make porting more incremental, K3MultipleDrag is provided for code that needs to work with
Q3DragObject until being fully ported.</p>

<h4>KNetwork::KIpAddress</h4>
<p>Removed. Use QHostAddress instead.</p>

<h4>KNetwork::KResolver</h4>
<p>Removed. If you need to resolve a hostname, use QHostInfo from QtNetwork.</p>

<h4>KNetwork::KSocketAddress and KNetwork::KInetSocketAddress</h4>
<p>Removed. Use QHostAddress and an integer (a quint16_t) to store the port number.</p>

<h4>KNetwork::KUnixSocketAddress</h4>
<p>Removed. Simply use a QString to represent the path or identifier. See the documentation on KLocalSocket.</p>

<h4>KNetwork::K*Socket</h4>
<ul>
<li>All of these classes are deprecated. Use the QTcpSocket,
  QUdpSocket and QTcpServer equivalents from QtNetwork.</li>
<li>When porting, use KSocketFactory when creating any sockets that
  are used to communicate with remote hosts (that is, anything that is
  not "localhost"). Examples follow:<br>

<b>Connecting to a remote host:</b>
<p><em>Old code:</em></p>
<pre>
  QString host;
  int port;

  KBufferedSocket *socket = new KBufferedSocket(parent);
  if (!socket-&gt;connect(host, QString::number(port))) {
      // error happened
      // deal with it
  }
  connect(socket, SIGNAL(connected(KResolverEntry)), SLOT(socketConnected()));
  connect(socket, SIGNAL(gotError(int)), SLOT(socketError(int)));
</pre>

<p>New code:</p>
<pre>
  QString protocol;
  QString host;
  int port;
  QUrl url(QString("%1://%2:%3").arg(prototocol, host).arg(port));

  QTcpSocket *socket = KSocketFactory::connectToHost(protocol, host, port, parent);
  // alternatively:
  // QTcpSocket *socket = KSocketFactory::connectToHost(url, parent);
  connect(socket, SIGNAL(connected()), SLOT(socketConnected()));
  connect(socket, SIGNAL(error(QAbstractSocket::SocketError), SLOT(QAbstractSocket::SocketError)));
</pre>

<b>Opening a socket for receiving remote connections:</b>
<p><em>Old code:</em></p>
<pre>
  int port;

  KServerSocket *ss = new KServerSocket(QString::number(port), parent);
  connect(ss, SIGNAL(readyAccept()), this, SLOT(slotReadyAccept()));
  connect(ss, SIGNAL(gotError(int)), this, SLOT(slotSocketError(int)));
  ss-&gt;listen();
</pre>

<p>New code:</p>
<pre>
  QString protocol;
  int port;

  QTcpServer *ts = KSocketFactory::listen(protocol, QHostAddress::Any, port, parent);
  connect(ts, SIGNAL(newConnection()), this, SLOT(slotReadyAccept()));
</pre>
</li>
<li><b>Caveat:</b> all member functions in QTcpSocket
  are <em>asynchronous</em> and buffered. There's no equivalent
  "blocking" mode for QTcpSocket. If you need an action to complete,
  you have to use <tt>waitForReadyRead</tt> and <tt>flush</tt>
  (or <tt>waitForBytesWritten</tt>) in the socket object. If you need
  to wait for a connection to be established,
  use <tt>KSocketFactory::synchronousConnectToHost</tt>.</li>
</ul>

<h4>KNotifyClient</h4>
<p>Replaced by KNotification. The API is quite similar, but the config file need to be updated. See KNotification documentation, and the file kdelibs/knotify/PORTING.html</p>

<h4>KProcess</h4>
<p>The kde3 version was deprecated and renamed to K3Process, header is k3process.h. 
Its usage is discouraged as it will create problems when being used together with
the new KProcess or QProcess in the same application, this is more of a problem in
applications that use KParts or plugins and can't control what those plugins do.</p>
<ul>
<li>start() lost all arguments, the setup of communication and program/arguments
has to be done before starting the process</li>
<li>suspend() and resume() where removed for now</li>
<li>quoting support moved to KShell namespace</li>
<li>getPid() was renamed to just pid()</li>
<li>clearArguments() was renamed to clearProgram()</li>
</ul>

<h4>KProcCtrl</h4>
<p>Deprecated and renamed to K3ProcessController, header is k3processcontroller.h.</p>

<h4>KProcIO</h4>
<p>Deprecated and renamed to K3ProcIO, header is k3procio.h.</p>

<h4>KRegExp</h4>
<p>Removed. Use QRegExp instead.</p>

<h4>KRFCDate</h4>
This class has been deprecated by KDateTime. It has been renamed K3RFCDate and moved to the libkde3support. The following method changes make porting easy:
<ul>
<li>KRFCDate::parseDate( string ) becomes KDateTime::fromString( string, KDateTime::RFCDate).toTime_t();</li>
<li>KRFCDate::parseDateISO8601( string ) becomes KDateTime::fromString( string ).toTime_t();</li>
<li>KRFCDate::localUTCOffset() becomes KDateTime::Spec::LocalZone().utcOffset / 60. Note that the KRFCDate version returned minutes while KDateTime returns seconds.</li>
</ul>

<h4>KSaveFile</h4>
<ul>
<li>KSaveFile has been modified from its KDE 3.x behavior to allow for new backup methods:
<ul>
<li>KSaveFile::backupFile() will use the backup behavior specified in KConfig.</li>
<li>KSaveFile::simpleBackupFile() will emulate the KDE 3.x behavior</li>
<li>KSaveFile::numberedBackupFile() will create a numbered set of backup files (default: 10)</li>
<li>KSaveFile::rcsBackupFile() will use rcs to maintain the backup file</li>
</ul></li>
<li>KSaveFile now derives from QFile so you can use it just like you would use a normal QFile. The close() function has been renamed to finalize(). Use the error() and errorString() functions to check for errors instead of status().</li>
<li>KSaveFile::close() is now KSaveFile::finalize()</li>
<li>You must call KSaveFile::open() to create the file.</li>
</ul>

<h4>KShortcutDialog</h4>
<p>Removed, see KKeySequenceWidget/KShortcutWidget.</p>

<h4>KShortcutList and derivatives</h4>
<p>Removed - no longer needed. Saving and loading of shortcuts is now performed in KActionCollection, KGlobalAccel, and KStandardShortcut.</p>

<h4>KSortableValueList</h4>
<ul>
<li>Has been ported to QList, renamed to KSortableList and the header is ksortablelist.h</li>
</ul>

<h4>KStandardDirs</h4>
<ul>
<li>boolean values as parameters for recursive, unique and checking for executability in the following methods were changed to instead take SearchOptions flags for improved code readability:
<ul>
<li>calcResourceHash</li>
<li>findAllResources</li>
<li>findResource</li>
<li>findExe</li>
<li>findAllExe</li>
</ul>
</li>
</ul>

<h4><a name="KStandardShortcut">KStandardShortcut</a> (was KStdAccel)</h4>
<ul>
<li>Removed deprecated methods</li>
<li>Removed WhatThis, use WhatsThis</li>
<li>shortcutDefault3() and shortcutDefault4() have been removed, use shortcutDefault() instead</li>
</ul>

<h4>KStaticDeleter</h4>
<p>Either use K3StaticDeleter or port to the <a href="http://api.kde.org/4.x-api/kdelibs-apidocs/kdecore/html/group__KDEMacros.html#ga75ca0c60b03dc5e4f9427263bf4043c7">K_GLOBAL_STATIC</a> macro.

<h4>KStdAccel</h4>
<p>Renamed to <a href="#KStandardShortcut">KStandardShortcut</a></p>

<h4>KStringHandler</h4>
<ul>
<li>static QString ljust( const QString &amp;text , int width ) -&gt; QString::leftJustified</li>
<li>static QString rjust( const QString &amp;text , int width ) -&gt; QString::rightJustified</li>
<li>matchFilename -&gt; matchFileName</li>
<li>static QString word( const QString &amp;text , int pos ) -&gt; QString::section </li>
<li>::randomString() has been moved to KRandom::randomString()</li>
<li>::lPixelSqueeze( text, fm, width ) -&gt; fm.elidedText( text, Qt::ElideLeft, width )</li>
<li>::cPixelSqueeze( text, fm, width ) -&gt; fm.elidedText( text, Qt::ElideMiddle, width )</li>
<li>::rPixelSqueeze( text, fm, width ) -&gt; fm.elidedText( text, Qt::ElideRight, width )</li>
</ul>

<h4>KTempDir</h4>
<ul>
<li>existing() was removed, use exists() instead</li>
<li>setAutoDelete() renamed to setAutoRemove()</li>
<li>The default for setAutoRemove() is now true instead of false</li>
<li>qDir() was removed as it was unused</li>
</ul>

<h4>KTempFile</h4>
<p>Deprecated and renamed to K3TempFile. Use KTemporaryFile instead.</p>
<p>When porting old KTempFile calls to KTemporaryFile, you need to remember that KTempFile by default will not automatically remove the fileonce the object is destroyed, but KTemporaryFile will! You also need to call open() in order to actually create the file.</p>

<h4>KURL</h4>
<ul>
<li>Renamed to KUrl, but a typedef is available for source compatibility</li>
<li>KUrl inherits QUrl now, but the API offered by KUrl is mostly unchanged</li>
<li>filename() has been removed, use fileName() instead</li>
<li>isMalformed -&gt; !isValid()</li>
<li>prettyURL(0,KUrl::StripFileProtocol) -&gt; pathOrURL()</li>
<li>fromPathOrURL() is deprecated, use the KUrl(str) constructor which now accepts both paths and urls</li>
<li>htmlURL() had to be removed, please use Qt::escape(url.prettyUrl()) now, with #include &lt;QTextDocument&gt;.
This requires libQtGui, which is why it can't be in KUrl anymore.</li>
<li>url(0,106) or any other use of the 'mib enum' for encoding has been removed. QUrl is UTF8 based, and the world is becoming more and more utf8 based as well, the old encoding hacks inside urls should disappear.</li>
<li>Runtime behavior change: port() used to return 0 if no port was specified. It now returns -1 in that case, or you can use port(defaultPort) to set what it should return if no port was specified.</li>
<li>adjustPath(), path(), encodedPathAndQuery() , url() , prettyUrl() was taking a int argument for handling trailing slash that has been replaced by an enum AdjustPathOption (0 =&gt; KUrl::LeaveTrailingSlash, 1 =&gt; KUrl::AddTrailingSlash, -1 =&gt; KUrl::RemoveTrailingSlash).
<li>cleanPath(), queryItems(), fileName(), directory(), equals() now take a QFlags argument instead of boolean</li>
<li>*URL* renamed to *Url*:
<ul>
  <li>hasSubURL() -&gt; hasSubUrl()</li>
  <li>prettyURL() -&gt; prettyUrl()</li>
  <li>pathOrURL() -&gt; pathOrUrl()</li>
  <li>upURL() -&gt; upUrl()</li>
  <li>isRelativeURL() -&gt; isRelativeUrl()</li>
  <li>relativeURL() -&gt; relativeUrl()</li>
</ul>
</li>
</ul>

<h4>KURLDrag</h4>
<p>This class has been moved to kde3support. Use KUrl::populateMimeData() and
KUrl::List::populateMimeData() in the drag/copy side,
and the static methods KUrl::List::canDecode() and KUrl::List::fromMimeData()
in the drop/paste side.</p>
<ul>
<li>Example: Replace <pre>  KURL::List uriList;
  if ( KURLDrag::canDecode(e) &amp;&amp; KURLDrag::decode( e, uriList ) ) {</pre>
by <pre>  KUrl::List uriList = KUrl::List::fromMimeData( e-&gt;mimeData() );
  if ( !uriList.isEmpty() ) {</pre></li>
</ul>

<h4>KVMAllocator</h4>
<p>Removed, as it was unused.</p>

<h4>KWin</h4>
This class has been merged with KWinModule into class KWindowSystem (in kdeui).
<ul>
<li>appStarted() removed, use KStartupInfo::appStarted() instead</li>
<li>info(WId win) removed, use windowInfo() instead</li>
<li>struct Info was removed, use WindowInfo instead</li>
</ul>

<h4>KWinModule</h4>
This class has been merged with KWinModule into class KWindowSystem (in kdeui).
Don't create instances, use static functions and KWindowSystem::self() for connecting to signals.
<ul>
<li>Functions related to systemtray have been removed. They worked only with the obsolete
KDE systray mechanism.</li>
<li>stackingOrder() no longer returns a reference to a list. Make a copy of the value first if using iterators.</li>
</ul>

<h4>KWin::WindowInfo</h4>
This class has been renamed KWindowInfo and moved to its own header: KWindowInfo or kwindowinfo.h. This class is not to be confused with KWindowInfo in KDE3 which was a small utility class to display message in the window icon and title. KWindowInfo represents the windowing system information for a give window, such as its geometry, desktop positioning, type, name, etc.

<h4>locate</h4>
<ul>
<li>locate() and locateLocal()  moved into the namespace KStandardDirs</li>
</ul>

<h4>NETRootInfo</h4>
<ul>
<li>NETRootInfo(Display *display, Window supportWindow, const char *wmName,unsigned long properties, int screen = -1, bool doActivate = true) -&gt;
    NETRootInfo(Display *display, Window supportWindow, const char *wmName,
                const unsigned long properties[], int properties_size,
                int screen = -1, bool doActivate = true);     old properties is the first element of the new array
</li>
<li>unsigned long supported() -&gt;   const unsigned long* supportedProperties() const;</li>
<li>    unsigned long properties() const -&gt; gone</li>
<li> WindowType windowType() -&gt;     WindowType windowType( unsigned long supported_types ) const;</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kdeui">Changes in kdeui</a></h3>
<ul>
<li>kactionclasses.h went away, use the several kxxxaction.h instead</li>
<li>kanimwidget.h was renamed to kanimatedbutton.h to reflect the class name</li>
<li>kcolordlg.h went away, use kcolordialog.h</li>
<li>kcolorbtn.h went away, use kcolorbutton.h</li>
<li>kdatapik.h went away, use kdatepicker.h</li>
<li>kdualcolorbtn.h went away, use kdualcolorbutton.h</li>
<li>KLanguageButton (and therefore klanguagebutton.h) was removed due to licensing issues (GPLv2, which is not allowed in kdelibs)</li>
<li>klistbox.h was renamed to klistwidget.h to reflect the class name</li>
<li>kpassdlg.h went away, use kpassworddialog.h</li>
<li>kxmlgui.h went away, use kxmlguifactory.h</li>
<li>kfontcombo.h went away, use QFontComboBox</li>
<li>libkwalletclient (which used to provide the KWallet class) has been merged with kdeui</li>
<li>system color scheme accessors in kglobalsettings.h are deprecated, use kcolorscheme.h</li>
<li>KPalette was renamed to KColorCollection</li>
<li>KPaletteTable was renamed to KColorTable and moved to private API</li>
</ul>

<h4>KAboutContainer</h4>
<p>Deprecated and renamed to K3AboutContainer. Use KAboutApplicationDialog or KAboutKdeDialog directly.</p>
<ul>
<li>KAboutContainer constructor int args have been replaced by Qt::Alignment</li>
<li>addTitle int args replaced by Qt::Alignment</li>
<li>addImage int args replaced by Qt::Alignment</li>
</ul>

<h4>KAboutContributor</h4>
<p>Deprecated and renamed to K3AboutContributor. Use KAboutApplicationDialog or KAboutKdeDialog directly.</p>
<ul>
<li>void setURL( const QString&amp; ) -&gt; void setUrl( const QString&amp; )</li>
<li>QString getName( void ) const -&gt; QString name() const</li>
<li>QString getEmail( void ) const -&gt; QString email() const</li>
<li>QString getURL( void ) const -&gt; QString url() const</li>
<li>QString getWork( void ) const -&gt; QString work() const</li>
<li>signal void openURL() -&gt; void openUrl()</li>
</ul>

<h4>KAboutDialog</h4>
<p>Deprecated and renamed to K3AboutDialog. Use KAboutApplicationDialog or KAboutKdeDialog directly.</p>
<ul>
<li>changed enum names<br>
<pre>
  AbtPlain         -&gt; Plain
  AbtTabbed        -&gt; Tabbed
  AbtTitle         -&gt; Title
  AbtImageLeft     -&gt; ImageLeft
  AbtImageRight    -&gt; ImageRight
  AbtImageOnly     -&gt; ImageOnly
  AbtProduct       -&gt; Product
  AbtKDEStandard   -&gt; KDEStandard
  AbtAppStandard   -&gt; AppStandard
  AbtImageAndTitle -&gt; ImageAndTitle
</pre>
</li>
<li>Constructor: K3AboutDialog( QWidget *parent = 0, bool modal = true ) -&gt; KAboutDialog( QWidget *parent = 0 )</li>
<li>Constructor: K3AboutDialog( int dialogLayout, const QString &amp;caption, ButtonCodes buttonMask,
                               ButtonCode defaultButton, QWidget *parent=0, bool modal=false, bool separator = false,
                               const QString &amp;user1 = QString(),
                               const QString &amp;user2 = QString(),
                               const QString &amp;user3 = QString() ) -&gt;
                 K3AboutDialog( int dialogLayout, const QString &amp;caption, QWidget *parent = 0 ) (see KDialog how to port)</li>
<li>void setIcon( const QString &amp;fileName ) which was deprecated has been removed</li>
<li>addContainerPage int args are now Qt::Alignment args</li>
<li>addScrolledContainerPage int args are now Qt::Alignment args</li>
<li>addContainer int args are now Qt::Alignment args</li>
<li>signal void openURL() -&gt; void openUrl()</li>
<li>void imageURL() -&gt; void imageUrl()</li>
<li>void openURLSlot() -&gt; void openUrlSlot()</li>
</ul>

<h4>KAboutWidget</h4>
<p>Deprecated and renamed to K3AboutWidget. Use KAboutApplicationDialog or KAboutKdeDialog directly.</p>
<ul>
<li>signal void openURL() -&gt; void openUrl()</li>
<li>void openURLSlot() -&gt; void openUrlSlot()</li>
</ul>

<h4><a name="KAction">KAction</a></h4>
<p>Making KAction a subclass of QAction (actually QWidgetAction) brings KDE more into line with the Qt way of creating user interfaces, improves accessibility, and removes code duplication.</p>
<p>QAction in Qt4 is a true first-class citizen - all QWidgets now have a list of associated actions, and QToolBar, QMenu etc. all use this list directly to show the graphical items (widgets, entries in the menu, etc).  This has replaced all usage of integers as "id"s.  There is also a new QEvent (QActionEvent), and the corresponding virtual protected function in QWidget, actionEvent().</p>
<ul>
<li>KAction is now a subclass of QWidgetAction.</li>
<li>For actions that are mostly in menus, you should port setToolTip to setStatusTip. The goal in kde3 was mostly to see the help text in the status bar, while in Qt4 setToolTip has no effect on menu items.<li>
<li>Don't use setIconSet() anymore, use setIcon(KIcon(iconName)) instead</li>
<li>activated(), activated(int) signals deprecated - use triggered() signal instead</li>
<li>activate() is now trigger(), as in QAction</li>
<li>there is a replacement for activation providing keyboard + mouse states, see triggered(Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers) [currently buggy]</li>
<li>plugAccel(), unplugAccel(), kaccelCount() removed - they have no use now (accelerator management is inside Qt)</li>
<li>itemId(), getToolButtonID() removed - actions no longer have ids, basically the QAction* is its replacement</li>
<li>setGroup() / group() removed - use QActionGroup instead (setActionGroup() / actionGroup())</li>
<li>ActivationReason has been removed (not supported by Qt). For a surrogate, you can connect to QMenu::triggered(QAction*), QToolBar::actionTriggered(QAction*), etc.</li>
<li>setters are no longer slots; where they were used as such, an intermediary will be required</li>
<li>New feature from Qt: statusTip() / setStatusTip().  Usually this will be the same as the tooltip.  It appears in the status bar whenever the action is hovered in a QMenu.  A porting convenience is being investigated for automatic toolTip() -&gt; statusTip(), but the best solution is to set both.</li>
<li>New feature: globalShortcut() and globalShortcutAllowed().  Automatically communicates with KGlobalAccel to register a global shortcut (i.e. one that does not need the application to have focus to be activated).</li>
<li>setShortcut() now defaults to setting the default shortcut as well (as it was by far the most common use case).  To just set the custom shortcut, use setShortcut(myShortcut, KAction::CustomShortcut)</li>
<li>Renamed "Custom" shortcuts to "Active" shortcuts.</li>
<li>Added setShortcut(QKeySequence &amp;) to explicitly override QAction::setShortcut.</li>
<li>Functions in KActionCollection or KXMLGUIFactory for example don't take or return KAction pointers
anymore but instead operate on QAction pointers. If you get compilation errors with code like the
following then just replace KAction with QAction:
<pre>
QAction *a = actionCollection()-&gt;action("foo");
...
</pre>
Also if you get errors about KAction being an unknown type it is often enough to forward declare
KAction in your header file.
<li>plug() -&gt; QWidget::addAction()
<li>unplug() -&gt; QWidget::removeAction()
<li>isPlugged() -&gt; !action-&gt;associatedWidgets().isEmpty()
<li>containerCount() -&gt; action-&gt;associatedWidgets().count()
<li>container(int i) -&gt; action-&gt;associatedWidgets().value(i)
<li>hasIcon() -&gt; !action-&gt;icon().isNull()
<li>setIconName(string) -&gt; setIcon(KIcon(string))
<li>unplugAll() -&gt; Rarely needed, but if you are sure that you need it replace it with the following
code:
<pre>
foreach (QWidget *w, action-&gt;associatedWidgets())
    w-&gt;removeAction(action);
</pre>
<li>The KAction constructors changed completely. The constructors taking various action properties,
a pointer to an acion collection and the name of the action have been removed. The new pattern is to
create the actions like regular QObjects with a parent (owner). Then you set various properties using
setText, setIcon, etc. . As a last step the action can be added to the action collection with a name.
<pre>
KAction *a = new KAction(this);
a-&gt;setText(i18n("I am ported"));
a-&gt;setIcon(KIcon("shiny"));
a-&gt;setShortcut(Qt::ControlModifier + Qt::Key_A);
actionCollection - &gt; addAction("name_of_the_action", a);
</pre>
KActionCollection additional provides convenience overloads for creating named KAction objects or
standard actions (KStandardAction). For example:
<pre>
QAction *a = actionCollection -&gt; addAction("action_name");
a-&gt;setText(i18n("I have been ported, too"));
connect(a, SIGNAL(triggered()), this, SLOT(portedToKde4()));

actionCollection -&gt; addAction(KStandardAction::Copy, this, SLOT(copy()))
</pre>
</ul>

<h4>KActionCollection</h4>
<ul>
<li>constructor (QWidget* watch, ..) and setWidget() replaced by associateWidget() - allows actions to respond to matching key presses on a widget level (basically a convenience method to have all actions in the collection added to the associated widget(s) and their shortcut scopes set to Qt::WidgetShortcut). (note: associateWidget() replaces {set|add|remove}AssociatedWidget() from kde4 beta)</li>
<li>*AutoConnectShortcuts removed - irrelevant</li>
<li>*accel() removed - irrelevant (KAccel no longer handles key presses)</li>
<li>New functions setConfigGroup(), setConfigGlobal(), configGroup(), configIsGlobal() - the action collection now stores the group whether the config is global. referenced in readSettings() / writeSettings()</li>
<li>readShortcutSettings() and writeShortcutSettings() renamed without the "Shortcut".  Set the configGroup() with setConfigGroup() either prior to each call, or (preferably) at the creation time of the action collection.</li>
<li>{set}HighlightingEnabled(), {connect|disconnect}Highlight() removed - highlighting is always enabled now</li>
<li>actionHighlighted(), actionStatusText(), clearStatusText() removed - use QAction::setStatusTip() as a replacement.  QStatusBars belonging to QMainWindow automatically get the statusTip() applied to them when they are moused over in a QMenu, via a QStatusTipEvent.</li>
<li>groups() removed (now using QActionGroups) - see actionGroups() (and actionsWithoutGroup()) for replacement</li>
<li>actions( const QString&amp; group ) removed - use actionGroups() instead, and then QActionGroup::actions()</li>
<li>action(const char* name, const char* className) removed: action(const QString&amp; name), actions(const QString&amp; name), actionOfType&lt;Class&gt;(const QString&amp; name), actionsOfType&lt;Class&gt;(const QString&amp; name) are the replacements</li>
<li>insert(KAction *) -&gt; addAction(const QString &amp;name, QAction *action)
<li>remove(KAction *) -&gt; removeAction(QAction *action)
<li>take(KAction *) -&gt; takeAction(QAction *action)
</ul>

<h4>KActionSelector</h4>
<ul>
<li>Q3ListBox -&gt; QListWidget</li>
<li>selectedListBox  -&gt;  selectedListWidget</li>
<li>availableListBox  -&gt;  availableListWidget</li>
</ul>

<h4>KActionSeparator</h4>
<p>Used to be renamed to KSeparatorAction. KSeparatorAction/KActionSeparator is dead now. Just create a QAction object and call setSeparator(true); on it.</p>
<p><b>Note:</b> you need to create multiple separator actions if you want to insert multiple separators into a widget, unlike with KDE3.</p>

<h4>KActiveLabel</h4>
<p>Deprecated and renamed to K3ActiveLabel. Use QLabel instead.</p>
<ul>
<li>Use QLabel::setOpenExternalLinks(true) for labels with hyperlinks.</li>
<li>Use QLabel::setTextInteractionFlags(Qt::TextSelectableByMouse|Qt::TextSelectableByKeyboard) for labels whose text should be selectable by user.</li>
<li>Inherits from KTextBrowser instead of Q3TextBrowser</li>
<li>You don't need anymore to disconnect the linkClicked signal to handle manually link,  use KTextBrowser::setNotifyClick(true)</li>
<li>linkClicked -&gt; KTextBrowser::urlClick</li>
</ul>

<h4><a name="KAnimatedButton">KAnimatedButton</a> (was KAnimWidget)</h4>
<ul>
<li>Now a subclass of QToolButton, acts in a much more standard fashion</li>
<li>size(), setSize() replaced by iconSize(), setIconSize()</li>
<li>Call updateIcons() whenever you change the iconSize() (the setter is non-virtual :( )</li>
</ul>

<h4>KAnimWidget</h4>
<p>Renamed to <a href="#KAnimatedButton">KAnimatedButton</a></p>

<h4>KAuthIcon</h4>
<p>Removed since it was not used.</p>

<h4>KBugReport</h4>
<ul>
<li>void updateURL() -&gt; void updateUrl()</li>
</ul>

<h4>KButtonBox</h4>
<p>Deprecated and renamed to K3ButtonBox. Use KDialogButtonBox instead. Add the role parameter to the addButton function. Or check if it can't be achieved using KDialog.</p>

<h4>KCharSelectTable</h4>
<p>Removed from public API. Use KCharSelect.</p>

<h4>KCharSelect</h4>
<ul>
<li>Cleaned up constructor, removed char, font and table arguments. The concept of showing tables isn't used any more and all functions/signals are removed. There is no need for a replacement.</li>
<li>highlighted()/focusItemChanged()/activated()  -&gt;  currentCharChanged(QChar)</li>
<li>doubleClicked()  -&gt;  charSelected(QChar)</li>
<li>setFont()/font()  -&gt;  setCurrentFont()/currentFont()</li>
<li>fontChanged()  -&gt;  currentFontChanged()</li>
<li>QFont is used for fonts instead of a QString containg the font face.</li>
<li>setChar()/chr()  -&gt;  setCurrentChar()/currentChar()</li>
<li>enableFontCombo(), enableTableSpinBox(), isFontComboEnabled() and isTableSpinBoxEnabled() are removed.</li>

</ul>

<h4>KColorCells</h4>
<ul>
<li>KColorCells now inherits from QTableWidget instead of Q3GridView.</li>
<li>numCells() has been replaced by count().</li>
<li>getSelected() has been replaced by selectedIndex().</li>
<li>The parameters of the colorSelected() and colorDoubleClicked() signals now include both the index of the color which
was selected and the color itself as arguments</li>
</ul>

<h4><a name="KColorCollection">KColorCollection</a> (was KPalette)</h4>
<ul>
<li>nrColors() was renamed to count()</li>
<li>colorName() was renamed to name()</li>
<li>getPaletteList() was renamed to installedCollections()</li>
<li>color(int), name(int) and name(const QColor&amp;) have been made const</li>
</ul>

<h4>KColorDrag</h4>
<p>Deprecated and renamed to K3ColorDrag. Use QMimeData directly instead or KColorMimeData, which most closely resembles KColorDrag</p>

<h4>KColorScheme</h4>
<p>New class that provides access to system-wide, user configurable color roles.
Like QPalette, the return type is now QBrush instead of QColor.
As of 4.0 the brushes are solid colors, but this may change in the future.</p>

<p><b>Warning:</b> KDE4 is trying <i>really</i> hard to abandon the notion that
the active palette == the inactive palette (because this is really helpful for
the oxygen windeco which does not use "traditional" windeco colors, and because
for various reasons kwin can't be entirely responsible for the effect). When
porting to KDE4, you will need to take this into consideration. The new class
KStatefulBrush has been added to help with this, as well as the adjustForeground
and adjustBackground methods of KColorScheme.</p>

<p>There are lots of bugs as a result of this; some in applications, and at
least a few in Qt. Please report application bugs to the appropriate maintainer
or list, and general (i.e. occurring in many/all applications) bugs to
<a href="mailto:kde-core-devel@kde.org">k-c-d</a>.</p>

<p>See the <a href="http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKColorScheme.html">KColorScheme documentation</a> for further information.</p>

<h4><a name="KColorTable">KColorTable</a> (was KPaletteTable)</h4>
<ul>
<li>palette() was renamed to name()</li>
<li>slot setPalette() was renamed to slot setColors()</li>
</ul>

<h4>KComboBox</h4>
<ul>
<li>void setURLDropsEnabled() -&gt; void setUrlDropsEnabled()</li>
<li>bool isURLDropsEnabled() -&gt; bool urlDropsEnabled()</li>
<li>void setEditURL() -&gt; void setEditUrl()</li>
<li>void addURL( ... ) -&gt; void addUrl( ... )</li>
<li>void insertURL( ... ) -&gt; void insertUrl( ... )</li>
<li>void changeURL( ... ) -&gt; void changeUrl( ... )</li>
</ul>

<h4>KCommand</h4>
<p>Deprecated and renamed to K3Command, header is k3command.h.
Use QUndoCommand instead.
</p>

<h4>KCommandHistory</h4>
<p>Deprecated and renamed to K3CommandHistory, header is k3command.h.
Use KUndoStack instead.
</p>

<h4>KCompletion</h4>
<ul>
<li>enableSounds() was removed, use setSoundsEnabled()</li>
<li>disableSounds() was removed, use setSoundsEnabled()</li>
<li>isSoundsEnabled() -&gt; soundsEnabled()</li>
</ul>

<h4>KConfigDialog</h4>
<ul>
<li>The dialog name is now a QString instead of a const char*</li>
<li>signal void settingsChanged(const char *dialogName); -&gt; void settingsChanged(const QString&amp; dialogName);</li>
<li>signal void settingsChanged(); has disappeared - use the signal with the parameter instead. If you don't need the parameter don't connect it, e.g <pre>connect(myDialog, SIGNAL(settingsChanged(const QString&amp;)), this, SLOT(mySlot()));</pre></li>
</ul>

<h4>KContextMenuManager</h4>
<ul>
<li>KContextMenuManager::insert() :
<p>Old code:</p>
<pre>
KContextMenuManager::insert(widget, menu);
</pre>
<p>New code:</p>
<pre>
widget-&gt;setContextMenuPolicy(Qt::ActionsContextMenu);
widget-&gt;addActions(menu-&gt;actions());
</pre>
<li>Otherwise consider handling the context menu in a contextMenuEvent() handler, which Qt
calls automatically on a right-mouse-button click or on activation by the context menu key.
There's no need to do anything in mousePressEvent/mouseReleaseEvent/keyPressEvent.
</ul>

<h4>KCursor</h4>
<ul>
<li>KCursor is now a QCursor, allowing for loading of non-standard icons from themes</li>
<li>The static methods for loading various cursor types are gone, just use QCursor( Qt::CursorShape ) directly instead</li>
</ul>

<h4>KDatePicker</h4>
<ul>
<li>signal void dateChanged(QDate); was replaced by void dateChanged( const QDate&amp;);</li>
<li>signal void dateEntered(QDate); was replaced by void dateEntered( const QDate&amp;);</li>
<li>signal void dateSelected(QDate); was replaced by void dateSelected( const QDate&amp;)</li>
<li>changed the order of the constructor's parameter</li>
<li>removed getData() method.  Use date() instead</li>
<li>removed protected slot <tt>void selectWeekClicked()</tt></li>
</ul>

<h4>KDateTable</h4>
<ul>
<li>signal void dateChanged(QDate); was replaced by void dateChanged(const QDate&amp;);</li>
<li>changed the order of the constructor's parameter</li>
<li>removed getData() method.  Use date() instead</li>
</ul>

<h4>KDateWidget</h4>
<ul>
<li>signal void changed(QDate); was changed by void changed(const QDate&amp;)</li>
</ul>

<h4>KDialog</h4>
<ul>
<li>Simplified ctor.
<pre>
The following ctor

  KDialog dlg( parent, i18n("my caption"), modal, Ok | Cancel | User1, Ok, false, i18n("Share File"))

should be rewritten as

  KDialog dlg( parent );
  dlg.setCaption( i18n("my caption") );
  dlg.setModal( modal );
  dlg.setButtons( Ok | Cancel | User1 );
  dlg.setButtonGuiItem( User1, i18n("Share File") );
  dlg.setDefaultButton( Ok );
  dlg.showButtonSeparator( false );
</pre>
</li>
<li>setButtonMask() -&gt; setButtons() and setButtonGuiItem()</li>
<li>setButtonBoxOrientation() -&gt; setButtonsOrientation()</li>
<li>setButtonOKText, setButtonApplyText , setButtonCancelText  -&gt; setButtonText( ButtonCode, const QString&amp; )</li>
<li>setDetails() -&gt; setDetailsWidgetVisible()</li>
<li>don't overide anymore slotFoo(). You now need to connect to FooClicked signal.
    Or reimplement accept() and reject() to intercept the Ok and Cancel button</li>
<li>enableButtonOK -&gt; enableButtonOk &nbsp;&nbsp; (lower case 'k')</li>
<li>enableButtonSeparator -&gt; showButtonSeparator</li>
</ul>

<h4>KDialogBase</h4>
<p>Deprecated. Use KDialog or KPageDialog instead.</p>
<ul>
<li>If the KDialogBase is Swallow or Plain mode you should replace it with KDialog, for
all other modes use KPageDialog
<pre>
Replace

  QWidget *page = plainPage();

with

  QWidget *page = new QWidget( this );
  setMainWidget( page );

All makeXXXMainWidget() methods can be replaced by the following schema:

  KVBox *mainWidget = makeVBoxMainWidget();

replace with

  KVBox *mainWidget = new KVBox( this );
  setMainWidget( mainWidget );
</pre>
</li>
<li>If you use a KPageDialog, the following steps must be taken...
<pre>
Replace ctor

  KDialogBase dlg( Tabbed, 0, parent, name, modal, i18n( "my caption" ), ... )

with

  KPageDialog dlg( parent );
  dlg.setFaceType( KPageDialog::Tabbed );
  dlg.setObjectName( name );
  dlg.setModal( modal );
  dlg.setCaption( i18n( "my caption" ) );
  ...

All addXXXPage() methods can be replaced by the following schema:

  KVBox *page = addVBoxPage( i18n( "My Title" ), i18n( "My Header" ), QPixmap( "image" ) );

replace with

  KVBox *page = new KVBox();
  KPageWidgetItem *item = addPage( page, i18n( "My Title" ) );
  item-&gt;setHeader( i18n( "My Header" ) );
  item-&gt;setIcon( KIcon( "image" ) );
</pre>
</li>
<li>The virtual methods associated with each button (slotOk(), slotCancel(), etc.) have been merged into a single KDialog::slotButtonClicked(int button) virtual method. However, the most direct replacement for slotOk() and slotCancel() is to reimplement QDialog::accept() and QDialog::reject(), respectively. For all other buttons, consider connect()ing to the corresponding signals provided by KDialog (helpClicked(), etc.).
</li>
</ul>

<h4>KDockWindow</h4>
<p>This class is obsolete and is provided for compatibility only. Use KSystemTrayIcon instead.</p>

<h4>KDualColorButton</h4>
<p>Removed since it was not used.</p>

<h4>KEdit</h4>
<ul>
<li>The signal gotUrlDrop was removed, nobody used it, and it's easy to do in the application
if needed (see the KURLDrag section)</li>
</ul>

<h4>KEditListBox</h4>
<ul>
<li>void insertStrList(const QStrList* list, int index=-1) and void insertStrList(const QStrList&amp; list, int index=-1) have been deprecated, use QStringList or const char** instead</li>
</ul>

<h4>KEditToolbar</h4>
<ul>
<li>KEditToolbar is now KEditToolBar</li>
<li>The static setDefaultToolBar was renamed to setGlobalDefaultToolBar</li>
<li>The constructors have been simplified to take either a KActionCollection* or a KXMLGUIFactory*, depending on whether the app is using XMLGUI or not. To set a non-default resource file in the KActionCollection* case, call setResourceFile.</li>
</ul>

<h4>KEditToolbarWidget</h4>
<ul>
<li>KEditToolbar is now KEditToolBarWidget</li>
<li>The constructors have been simplified to take either a KActionCollection* and a parent widget or just a parent widget. The latter is for use with XMLGUI. Before being shown, the new load() methods should be called. These allow for populating the widget before being shown but after construction, which is useful when allowing the resource file to be changed as in KEditToolBar.</li>
</ul>

<h4>KFind</h4>
<ul>
<li>The constructors have been simplified to take an optional parent. Other parameters must be set by using the API directly, e.g. setHasSelection and setSearch.</li>
<li>The options argument in the constructor is now an enumerated flag of type KFind::Options.</li>
<li>resetCounts() was renamed to resetMatchCount().</li>
<li>The Options flags from KReplace were added to the Options enumeration of KFind.</li>
</ul>

<h4>KFontChooser</h4>
<ul>
<li>Was in kfontdialog.h, but was moved to it's own header, so now either do #include &lt;KFontChooser&gt; or #include &lt;kfontchooser.h&gt;</li>
<li>The KFontChooser constructors now take a set of flags to determine how it is displayed, which replaces the numerous bools used previously. The following mappings from the bools in KDE3 and the enum in KDE4 are as follows:
<ul>
<li>3rd parameter onlyFixed -&gt; FixedFontsOnly</li>
<li>5th parameter makeFrame -&gt; DisplayFrame</li>
<li>7th parameter diff -&gt; ShowDifferences</li>
</ul>
</li>
</ul>

<h4>KFontDialog</h4>
<ul>
<li>The KFontDialog constructor now takes a set of flags to determine how it is displayed, which replaces the numerous bools used previously. The following mappings from the bools in KDE3 and the enum in KDE4 are as follows:
<ul>
<li>3rd parameter onlyFixed -&gt; KFontChooser::FixedFontsOnly</li>
<li>5th parameter makeFrame -&gt; KFontChooser::DisplayFrame</li>
<li>7th parameter diff -&gt; KFontChooser::ShowDifferences</li>
</ul>
</li>
<li>The second argument for getFontDiff() is now a reference to a KFontChooser::FontDiffFlags instead of an int.</li>
</ul>

<h4>KGlobalAccel</h4>
<ul>
<li>Moved from kdecore.</li>
<li>bool useFourModifierKeys() has been removed (we always use four modifier keys now).</li>
<li>Now a singleton</li>
<li>You shouldn't need to access this class much... just use setGlobalShortcut() in KAction.</li>
</ul>

<h4>KGlobalSettings</h4>
<ul>
<li>Moved from kdecore.</li>
<li>KGlobalSettings is now a QObject so can emit signals like kdisplayPaletteChanged() instead of KApplication</li>
<li> deprecated &quot;static QString trashPath()&quot; has been removed. use KIO::trash instead</li>
<li>Palette color accessors have been removed. Libraries should restrict themselves to colors available in QPalette (always use the widget's palette and not a global palette), otherwise use an appropriately constructed KColorScheme instead. This does not include/affect WM color accessors.</li>
</ul>

<h4>KGradientSelector</h4>
<ul>
<li>Reversed the value range, if orientation is horizontal. Now minimum is on the left and maximum on the right side.</li>
</ul>

<h4>KGuiItem</h4>
<ul>
<li>Don't use setIconSet anymore, use setIcon instead, there is no compatibility class or function</li>
</ul>

<h4>KHistoryCombo</h4>
<p>Renamed to KHistoryComboBox.</p>
<ul>
<li>Was in kcombobox.h, but was moved to it's own header, so now do #include &lt;khistorycombobox.h&gt;</li>
</ul>

<h4>KHSSelector</h4>
<ul>
<li>Renamed to KHueSaturationSelector, moved to kxyselector.h</li>
</ul>

<h4>KIcon</h4>
<ul>
<li>New class (old one renamed to K3Icon)</li>
<li>Thin wrapper around QIcon which creates a KIconEngine corresponding to the kde named icon</li>
</ul>

<h4>KIconLoader</h4>
<ul>
<li>Moved from kdecore and is now a QObject.</li>
<li>Deprecated loadIconSet(), DesktopIconSet(), BarIconSet(), SmallIconSet(), UserIconSet(): use KIcon(name) or KIcon(name,instance-&gt;iconLoader()) instead.<br/>
Note that this can change slightly the look of the icon in some cases: for instance if code was calling setIcon(BarIconSet())
on a pushbutton, it meant the icon was loaded at toolbar size and then resized down.
With KIcon(name), the small icon is picked up instead, which might look different, but this is the correct behavior.
These deprecated methods were also altered to not take a KComponentData (KInstance* in KDE3), which was an optional parameter in KDE3.</li>
<li>the State parameter was used to be both define the state of the icon one of a limited number of overlays. Overlays are now a separate parameter, a QStringList, containing the names of icons to overlay. The new overlays parameter now follows the state parameter.</li>
</ul>

<h4>KInputDialog</h4>
<ul>
<li>static QString KInputDialog::text( const QString &amp;caption,...) was replaced by QString KInputDialog::getText( const QString &amp;caption,...)</li>
</ul>

<h4>KIntNumInput, KDoubleNumInput, KDoubleSpinBox</h4>
<ul>
<li>Qt::Alignment for label alignment instead of int</li>
<li>setMinValue(min) -&gt; setMinimum(min) / minValue() -&gt; minimum()</li>
<li>setMaxValue(min) -&gt; setMaximum(min) / maxValue() -&gt; maximum()</li>
</ul>

<h4>KDoubleSpinBox</h4>
<ul>
<li>It was removed and replaced by QDoubleSpinBox</li>
</ul>

<h4>KIntSpinBox</h4>
<ul>
<li>In the long version of the constructor, the arguments parent and base have switched places.</li>
</ul>

<h4>KJanusWidget</h4>
<p>Deprecated. Use KPageWidget instead.</p>

<h4>KKeyButton</h4>
<p>Removed. Use either KKeySequenceWidget or KShortcutWidget. Use KShortcutWidget only if you really want two possible shortcuts. Both don't pop up a modal dialog.</p>

<h4>KKeyChooser</h4>
<p>Renamed to <a href="#KShortcutsEditor">KShortcutsEditor</a>.</p>

<h4>KKeyDialog</h4>
<p>Renamed to <a href="#KShortcutsDialog">KShortcutsDialog</a>.</p>

<h4>KLed</h4>
<ul>
<li>int ensureRoundLed() -&gt; virtual int ledWidth() const</li>
<li>virtual void paintRound() -&gt; virtual void paintRaised()</li>
</ul>

<h4>KLineEdit</h4>
<ul>
<li>void cursorAtEnd() removed, use QLineEdit::end(false) instead</li>
<li>unused protected slots removed: void slotAboutToShow() and void slotCancelled()</li>
<li>void setEnableSqueezedText( bool enable ) -&gt; void setSqueezedTextEnabled( bool enable )</li>
<li>void setURLDropsEnabled() -&gt; void setUrlDropsEnabled()</li>
<li>bool isURLDropsEnabled() -&gt; bool urlDropsEnabled()</li>
<li>void setURL() -&gt; void setUrl()</li>
</ul>

<h4>KLineEditDlg</h4>
<p>Was deprecated, has been removed. Use KInputDialog instead.</p>

<h4>KListAction</h4>
<p>Removed; as per comments, did not add anything to KSelectAction.</p>

<h4>KListBox</h4>
<p>Deprecated and renamed to K3ListBox. Use KListWidget (based on the QListWidget class).</p>

<h4>KListView</h4>
<p>Deprecated and renamed to K3ListView.<br>
There is no direct KDE replacement for this class yet.<br>
Either use KListWidget for list-based widgets or QTreeWidget for tree-based
widgets. Note that only QTreeWidget supports headers.</p>

<h4>KListViewSearchLine</h4>
<p>Deprecated and renamed to K3ListViewSearchLine.<br>
You should port from K3ListView to QTreeWidget and then use
KTreeWidgetSearchLine instead.</p>

<h4>KMacroCommand</h4>
<p>Deprecated and renamed to to K3MacroCommand, header is k3command.h.
Use QUndoCommand instead which can group child commands.
</p>

<h4>KMainWindow</h4>
<ul>
<li>getMemberList() was replaced by memberList() and memberList was renamed to mMemberList and made it private</li>
<li>sizeForCentralWidgetSize(QSize size) returned the size the main window should have so that the central widget will be of size.  You normally don't need this, the recommended way to achieve a certain central widget size is as follows.<br>
 * Override sizeHint() in the central widget so that it returns the desired size.<br>
 * Call updateGeometry() in the central widget whenever the desired size changes. This ensures that the new sizeHint() is properly propagated to any parent layout.<br>
 * Now call adjustSize() in the main window to resize the main window such that the central widget will become the desired size.</li>
<li>Ported to QMainWindow</li>
<li>accel() removed - KAccel no longer needed</li>
<li>If you need XmlGui functions from KMainWindow you may want to use KXmlGuiWindow instead of KMainWindow.</li>
</ul>

<h4>KMainWindowInterface</h4>
<ul>
<li>functionsDynamic() now returns a DCOPCStringList</li>
<li>function processDynamic arguments uses DCOPCString instead of QCString :
    <pre>bool processDynamic(const DCOPCString &amp;fun, const QByteArray &amp;data, DCOPCString&amp; replyType, QByteArray &amp;replyData);</pre></li>
<li>actions() now returns a DCOPCString</li>
</ul>

<h4><a name="KMenu">KMenu</a> (was KPopupMenu)</h4>
<ul>
<li>indexes replaced by QAction*</li>
<li>title, titlePixmap, and changeTitle removed - use QAction::text(), QAction::icon(), QAction::setText() and QAction::setIcon</li>
<li>contextMenuFocusItem changed to contextMenuFocusAction in line with the change from indexes to actions</li>
</ul>

<h4>KMessageBox</h4>
<ul>
<li>Where applicable, the static functions now take an additional argument to specify the cancel button. Since a default argument is provided, this will affect your code only, if you specified dontAskAgainName and/or options. In those cases, adding an additional parameter KStandardGuiItem::cancel() leads to the old behavior. The following functions are affected (omitting function arguments in the list): questionYesNoCancel(), questionYesNoCancelWId(), warningContinueCancel(), warningContinueCancelWId(),
warningContinueCancelList(), warningContinueCancelListWId(), warningYesNoCancel(), warningYesNoCancelWId(), warningYesNoCancelList(), warningYesNoCancelListWId(), messageBox(), messageBoxWId().</li>
</ul>

<h4>KNamedCommand</h4>
<p>Deprecated and renamed to K3NamedCommand, header is k3command.h.
Use QUndoCommand instead where name can be also stored using setText(const QString&).
</p>

<h4>KPalette</h4>
<ul>
<li>Renamed to <a href="KColorCollection">KColorCollection</a></li>
</ul>

<h4>KPaletteTable</h4>
<ul>
<li>Renamed to <a href="KColorTable">KColorTable</a></li>
</ul>

<h4>KPassivePopup</h4>
<ul>
<li>clicked single now emits a const QPoint reference</li>
</ul>

<h4>KPasswordEdit</h4>
<p>Deprecated and renamed to K3PasswordEdit. Use KLineEdit, with KLineEdit::setPasswordMode(true).</p>

<h4>KPasswordDialog</h4>
<p>Deprecated and renamed to K3PasswordDialog.</p>
<ul>
<li>asking for a new password -&gt;  KNewPasswordDialog</li>
<li>password() return QString</li>
<li>getPassword() gone, use the following code instead</li>
<!-- <li>kpassdlg.h was renamed kpassworddialog.h.</li> -->
<!-- <li>checkPassword take now a QString as argument</li> -->
</ul>
<pre>
KPasswordDialog dlg(parent);
dlg.setPrompt( prompt );
dlg.setWindowTitle( caption );
if( dlg.exec() != QDialog::Accepted )
    return;
use( dlg.password() );
</pre>

<h4>KPixmapIO</h4>
<p>Removed. Use QPixmap.toImage() and QPixmap::fromImage().</p>

<h4>KPixmapRegionSelecorDialog</h4>
<ul>
<li>getSelectedRegion was changed to selectedRegion</li>
<li>getSelectedImage was changed to selectedImage</li>
</ul>

<h4>KPopupMenu</h4>
<p>Renamed to <a href="#KMenu">KMenu</a>.</p>

<h4>KPopupTitle</h4>
<p>Removed; QMenu doesn't accept widgets, and QAction allows specification of font, icon etc... and gradients / background pixmaps weren't even working in KDE3. You can use KMenu::addTitle() instead, which creates QAction.</p>

<h4>KProgress</h4>
<p>Removed. Use QProgressBar instead.</p>
<ul>
<li>advance(int offset) -&gt; setValue(value()+offset)</li>
<li>QProgressBar has changed a lot in Qt4 ( setTotalSteps(totalSteps) -&gt; setRange(0, totalSteps), setProgress -&gt; setValue, percentageChanged -&gt; valueChanged ). For more details see QProgressBar class reference.</li>
</ul>

<h4>KProgressDialog</h4>
<ul>
<li>#include &lt;kprogressdialog.h&gt; instead of #include &lt;kprogress.h&gt;</li>
<li>progressBar() is a now QProgressBar instead of a KProgressBar -&gt; See KProgress API changes</li>
<li>setLabel(const QString &amp;) renamed to setLabelText(const QString &amp;)</li>
</ul>

<h4>KPushButton</h4>
<ul>
<li>Don't use setIconSet anymore, use setIcon instead, there is no compatibility class or function</li>
</ul>

<h4>KRadioAction</h4>
<p>Removed. Use KAction (or KToggleAction if you need different text/icons for the selected state) instead, in combination with an exclusive QActionGroup</p>

<h4>KRecentFilesAction</h4>
<ul>
<li>clearURLList() removed, use clear() instead</li>
<li>*URL* -&gt; *Url* as per KDE naming policy</li>
<li>the maxItem property is now an int (was a uint) (affects all accessors methods)</li>
</ul>

<h4>KRootPixmap</h4>
<p>Removed since it was not used.</p>

<h4>KSelectAction</h4>
<ul>
<li>now allows for combo box or button with popup menu when inserted to a toolbar</li>
<li>popupMenu() removed, use menu() instead</li>
<li>{set|}removeAmpersandsInCombo() removed - was deprecated</li>
</ul>

<h4>KSeparator</h4>
<ul>
<li>KSeparator now uses Qt::Vertical and Qt::Horizontal rather than QFrame's HFrame and VFrame.</li>
</ul>

<h4>KSessionManager</h4>
<p>Moved from kdecore, renamed from KSessionManaged, and moved to it's own header: ksessionmanager.h or KSessionManager</p>

<h4>KSharedPixmap</h4>
<p>Removed since is was not used.</p>

<h4>KShortcut</h4>
<ul>
<li>Moved from kdecore.</li>
<li>Now reentrant</li>
<li>Only uses QKeySequences now</li>
<li>Removed list semantics; remove() still has somewhat list-like behavior.</li>
<li>Introduced "primary" and "alternate" shortcuts to replace the arbitrary list of shortcuts</li>
<li>Removed casting operators</li>
<li>Removed operator&lt; and operator&gt;</li>
<li>Added a qHash(const KShortcut &amp;) function so you can use QHash with KShortcut instead of QMap</li>
<li>remove() -&gt; removeAll()</li>
<li>toList() -&gt; Not needed anymore since KShortcut inherits QList&lt;QKeySequence&gt;</li>
<li>toStringInternal() -&gt; You shouldn't be using this! But use toString() instead</li>
</ul>

<h4><a name="KShortcutsEditor">KShortcutsEditor</a> (was KKeyChooser)</h4>
<ul>
<li>Added new constructor parameter: ActionTypes types.  Allows you to filter the types of actions shown in the dialog.</li>
<li>Removed all functions dealing with old classes KShortcutList, KGlobalAccel (kde3 version)</li>
<li>Global shortcut conflict checking functions moved to KGlobalAccel.</li>
<li>Standard shortcuts checking functions were removed.</li>
</ul>
<p>See also <a href="#KShortcutsDialog">KShortcutsDialog</a>.</p>

<h4><a name="KShortcutsDialog">KShortcutsDialog</a> (was KKeyDialog)</h4>
<ul>
<li>Changed from edit/commit semantics to edit in-place/revert semantics. The old way didn't work in corner cases, the new way is quite a bit less complicated internally, and such cases only appear if a user opens multiple KKeyDialogs at the same time, which nobody does intentionally.</li>
<li>Rewritten. It was hard to read, which stood in the way of future changes/improvements.</li>
<li>Uses a new GUI layout.</li>
<li>removed KDE2 deprecated functions</li>
<li>Added new constructor parameter: KKeyChooser::ActionTypes types.  Allows you to filter the types of actions shown in the dialog.</li>
</ul>

<h4>KStatusBar</h4>
<ul>
<li>The unused BarStatus enum was removed.</li>
<li>The 'permanent' bool has been removed in favor of more explicit naming.<br>
  insertItem(text,id,true) -&gt; insertPermanentItem(text,id),<br>
  insertFixedItem(text,id,true) -&gt; insertPermanentFixedItem(text,id)</li>
</ul>

<h4>KStdAction</h4>
<p>Renamed to KStandardAction, header is kstandardaction.h.</p>
<ul>
<li>showToolbar() methods have been removed, see KMainWindow::setStandardToolBarMenuEnabled()</li>
</ul>

<h4>KStdGuiItem</h4>
<p>Renamed to KStandardGuiItem, header is kstandardguiitem.h.</p>
<ul>
<li>The StdItem enum was renamed to StandardItem</li>
</ul>

<h4>KSyntaxHighlighter</h4>
<ul>
<li>Use K3SyntaxHighlighter because it used Q3TextEdit or use KSyntaxHighlighter when your application will use QTextEdit</li>
</ul>

<h4>KSystemTray</h4>
<p>Renamed to KSystemTrayIcon for consistency with its actual purpose and naming in Qt (QSystemTrayIcon).</p>
<ul>
<li>Is now a subclass of QSystemTrayIcon and not QLabel. Therefore it is not a widget anymore. Otherwise, it behaves the same as in KDE3 when it comes to managing a parent window's visibility and providing an action collection to display in the context menu.</li>
</ul>

<h4>KTabBar</h4>
<ul>
<li>colors, close buttons on individual tabs not working at the moment</li>
<li>The old insertTab and removeTab have been removed, use addTab / insertTab / removeTab from QTabBar instead (uses indices, not QTab*s)</li>
</ul>

<h4>KTabCtl</h4>
<p>Removed. Use QTabWidget.</p>

<h4>KTextBrowser</h4>
<ul>
<li>Inherits from QTextBrowser instead of Q3TextBrowser</li>
</ul>

<h4>KTextEdit</h4>
<ul>
<li>void highLightWord() -&gt; void highlightWord()</li>
</ul>

<h4>KTimeWidget</h4>
<p>Removed. Use QTimeEdit.</p>

<h4>KTimezoneWidget</h4>
<p>Renamed to KTimeZoneWidget.</p>

<h4>KToggleAction</h4>
<ul>
<li>setExclusiveGroup() / exclusiveGroup() removed, use setActionGroup() and QActionGroup::setExclusive() for exclusivity (imitates the deleted KRadioAction class)</li>
<li>in comparison with KAction, adds setCheckedState() and sets this action to checkable</li>
</ul>

<h4>KToggleFullScreenAction</h4>
<ul>
<li>Simplified constructor
<pre>
Replace

  KToggleFullScreenAction( const KShortcut &amp;cut, const QObject* receiver, const char* slot,
                           KActionCollection* parent, QWidget* window, const QString&amp; name )

with

  KToggleFullScreenAction( QWidget* window, KActionCollection* parent, const QString&amp; name )

See <a href="#KAction">KAction</a> how to port the other arguments.
</pre>
</li>
</ul>

<h4>KToolBar</h4>
<ul>
<li>Ported to QToolBar</li>
<li>IconText, iconText(), setIconText() replaced by QToolBar::toolButtonStyle() et. al.</li>
<li>BarPosition, barPos(), setBarPos() replaced by Qt::ToolBarArea settings in QMainWindow; Unmanaged, Floating, and Flat are no longer supported (use QDockWidget if you need floating toolbars)</li>
<li>fullSize(), setFullSize() removed as now handled in QMainWindow - add or insert a tool bar break before (not needed for the first toolbar) and after the toolbar using QMainWindow::{add|insert}ToolBarBreak() to have the toolbar take up all available horizontal space</li>
<li>iconSize(), setIconSize() now a QToolBar property, and a QSize instead of an int - convenience function setIconDimensions() takes an int instead</li>
<li>insert*() and all associated item-manipulation methods removed - all done through actions now. Compatibility layer possible however so far I haven't found the functions to be used much in KDE programs (mostly it's taken care of by xmlgui instead)</li>
<li>flat(), setFlat() replaced by movable(), setMovable() (old "flat" concept equivalent to not movable)</li>
<li>layout-related methods removed (done by QToolBar's layout)</li>
<li>alignItemRight() removed (as above), replacement is to add a KToolBarSpacerAction before the action you want to be aligned right (or if you have a custom action already, just create a container widget and insert a QSpacerItem on the left of your custom widget (see KonqLogoAction in kdebase/konqueror/konq_actions.cc)</li>
<li><tt>enum BarStatus</tt> and <tt>bool enable(BarStatus stat)</tt> have been
removed</li>
<li><tt>void enableMoving(bool flag)</tt> and <tt>void enableFloating (bool
flag)</tt> have been removed in favor of <tt>setMovingEnabled(bool)</tt></li>
<li><tt>int maxHeight()/int maxWidth()</tt> removed in favor of
<tt>maximumHeight()/maximumWidth()</tt></li>
<li><tt>void setMaxHeight (int h)</tt> and <tt>void setMaxWidth (int dw)</tt>
removed in favor of <tt>setMaximumHeight()/setMaximumWidth()</tt></li>
<li>void setEnableContextMenu(bool enable = true) -&gt; void setContextMenuEnabled(bool enable = true)</li>
</ul>

<h4>KToolBarButton</h4>
<p>Removed. Done by QToolButton now.</p>

<h4>KToolBarLabelAction</h4>
<ul>
<li>Simplified constructors:
<pre>
  Replace

    KToolBarLabelAction( const QString &amp;text,
                         const KShortcut &amp;cut,
                         const QObject *receiver, const char *slot,
                         KActionCollection *parent, const QString&amp; name )

  with

    KToolBarLabelAction( const QString &amp;text,
                         KActionCollection *parent, const QString&amp; name )

  and

    KToolBarLabelAction( QAction *buddy, const QString &amp;text,
                         const KShortcut &amp;cut,
                         const QObject *receiver, const char *slot,
                         KActionCollection *parent, const QString&amp; name )

  with

    KToolBarLabelAction( QAction *buddy, const QString &amp;text,
                         KActionCollection *parent, const QString&amp; name )


  See KAction for how to port the other arguments.
</pre>
</li>
</ul>

<h4>KToolBarRadioGroup</h4>
<p>Removed. Done by QToolButton now.</p>

<h4>KToolBarSeparator</h4>
<p>Removed. Use QAction::setSeparator().</p>

<h4>KUndoRedoAction</h4>
<p>Deprecated and renamed to K3UndoRedoAction, header is k3command.h. 
KUndoStack::createRedoAction() and KUndoStack::createUndoAction() can be used instead but they currently lack popups with action lists.</p>

<h4>KURLLabel</h4>
<ul>
<li>renamed to KUrlLabel</li>
<li>void setAltPixmap() -&gt; void setAlternatePixmap()</li>
<li>QPixmap* altPixmap() -&gt; QPixmap* alternatePixmap()</li>
<li>void setGlow() -&gt; void setGlowEnabled()</li>
<li>void setFloat() -&gt; void setFloatEnabled()</li>
<li>void setURL() -&gt; void setUrl()</li>
<li>signal: void enteredURL( ... ) -&gt; void enteredUrl( ... )</li>
<li>signal: void leftURL( ... ) -&gt; void leftUrl( ... )</li>
<li>signal: void leftClickedURL( ... ) -&gt; void leftClickedUrl( ... )</li>
<li>signal: void rightClickedURL( ... ) -&gt; void rightClickedUrl( ... )</li>
<li>signal: void middleClickedURL( ... ) -&gt; void middleClickedUrl( ... )</li>
</ul>

<h4>KValueSelector</h4>
<p>Renamed to KColorValueSelector, moved to kcolorvalueselector.h</p>

<h4>KWidgetAction</h4>
<p>Removed. Use KAction or QWidgetAction and utilise its widget-setting capabilities.</p>

<h4>KWindowListMenu</h4>
<p>Moved to libkworkspace in kdebase</p>

<h4>KWizard</h4>
<p>Deprecated and renamed to K3Wizard. Use KAssistantDialog.</p>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kio">Changes in kio</a></h3>

<h4>KAbstractFileWidget</h4>
<ul>
<li>void setPreviewWidget(const KPreviewWidgetBase *w) -&gt; void setPreviewWidget(KPreviewWidgetBase *w)</li>
</ul>

<h4>KArchive/KTar/KZip/KAr</h4>
<ul>
<li>All sizes and file offsets now use qint64 (similar to QIODevice)</li>
<li>The API has changed for subclasses: there is a KArchive constructor that takes a filename, and which provides KSaveFile support automatically, writeDir is doWriteDir, prepareWriting is doPrepareWriting etc.</li>
<li>API changes for users of the class: isOpened() was renamed to isOpen(),
   doneWriting() to finishWriting(), and the order of the arguments for writeFile() is more usual:
   data comes before size.</li>
<li>KTarDirectory -&gt; KArchiveDirectory</li>
<li>KTarFile -&gt; KArchiveFile</li>
<li>KTarEntry -&gt; KArchiveEntry</li>
<li>KTarGz -&gt; KTar</li>
</ul>

<h4>KBookmark classes</h4>
<ul>
<li>KBookmarkDrag class has been moved to kde3support. Use KBookmark::populateMimeData() and
KBookmark::List::populateMimeData() in the drag/copy side,
and the static methods KBookmark::List::canDecode() and KBookmark::List::fromMimeData()
in the drop/paste side.</li>
<li>KBookmarkMenu constructor is much simpler. It always creates a toplevel menu, which makes the parameter isRoot and parentAddress superfluous. KBookmarkOwner now governs wheter to show a "Add Bookmark" Menu Entry, thus the constructor parameter add is gone.</li>
<li>KBookmarkMenu and KBookmarkBar no longer emits openBookmark(), override KBookmarkOwner::openBookmark() instead. </li>
<li>KBookmarkOwner::openBookmarkURL() was replaced by  KBookmarkOwner::openBookmark()</li>
<li>KExtendBookmarkOwner functionality was integrated into KBookmarkOwner. (And the API is more regular now.)</li>
<li>KBookmarkMenu::slotBookmarksChanged() and KBookmarkMenu::fillBookmarkMenu() are no longer public. Both had comments, that they shouldn't be used anyway.</li>
<li>KBookmarkMannager::managerForFile() requires a DBus Name as the second parameter.</li>
</ul>

<h4>KDEDesktopMimeType class</h4>
<ul>
<li>All the static methods have been moved to KDesktopFileActions, in kdesktopfileactions.h</li>
</ul>

<h4>KDirLister class</h4>
<ul>
<li>The constructor argument is now a separate setter, so: KDirLister(false) -&gt; KDirLister(); KDirLister(true) -&gt; KDirLister() + setDelayedMimeTypes(true). On the other hand, KDirLister being a QObject, it takes a QObject* parent argument.</li>
<li>KDirLister uses KFileItem by value now:
  <ul>
  <li>KFileItem* rootItem() const -&gt; KFileItem rootItem() const</li>
  <li>KFileItem* findByUrl( const KUrl&amp; url ) const -&gt; KFileItem findByUrl( const KUrl&amp; url ) const</li>
  <li>KFileItem* findByName( const QString&amp; name ) const -&gt; KFileItem* findByName( const QString&amp; name ) const</li>
  <li>bool matchesFilter( const KFileItem* ) const -&gt; bool matchesFilter( const KFileItem&amp; ) const</li>
  <li>bool matchesMimeFilter( const KFileItem* ) const -&gt; bool matchesMimeFilter( const KFileItem&amp; ) const</li>
  </ul>
</li>
<li>The following signals have changed:
  <ul>
  <li>void deleteItem( KFileItem *_fileItem ) -&gt; void deleteItem( const KFileItem &amp;fileItem )</li>
  <li>void refreshItems( const KFileItemList &amp;items ) -&gt; void refreshItems( const QList&lt;QPair&lt;KFileItem, KFileItem&gt;&gt; &amp;entries)</li>
  </ul>
</li>
</ul>

<h4>KDiskFreeSp class</h4>
<ul>
<li>Renamed to KDiskFreeSpace, moved to kdiskfreespace.h</li>
</ul>

<h4>KDESasl class</h4>
<ul>
<li>This class is removed due to its inflexiblity, use cyrus-sasl or the upcoming QCA SASL implementation</li>
</ul>

<h4>KDirSelectDialog</h4>
<ul>
<li>KDirSelectDialog moved to libkfile. If you were only using the static method selectDirectory, you can use KFileDialog::getExistingDirectory (for local files, i.e. if the second argument was true), or KFileDialog::getExistingDirectoryUrl</li>
</ul>

<h4>KFileDialog,KDirSelectDialog,KUrlRequesterDlg,KCustomMenuEditor,KUrlBarItemDialog</h4>
<ul>
  <li> are KDialogBases no more, now they are a KDialogs </li>
  <li> no more name and modal parameters in the constructors</li>
</ul>

<h4>KFileDialog, KDirOperator</h4>
<ul>
  <li> instead of KConfig* + QString group everywhere KConfigGroup is used now </li>
</ul>

<h4>KFileDialog</h4>
<ul>
<li>Changed constructor and method 'startDir' arguments from QString to KUrl

<pre>
  Affected methods:

    KFileDialog( ... )
    static QString getOpenFileNameWId( ... )
    static QStringList getOpenFileNames( ... )
    static KUrl getOpenURL( ... )
    static KUrl::List getOpenURLs( ... )
    static QString getSaveFileName( ... )
    static QString getSaveFileNameWId( ... )
    static KUrl getSaveURL( ... )
    static QString getExistingDirectory( ... )
    static KUrl getExistingURL( ... )
    static KUrl getImageOpenURL( ... )
</pre>
</li>
<li>getOpenURL, getOpenURLs, getExistingURL and getSaveURL were renamed to getOpenUrl, getOpenUrls, getExistingUrl and getSaveUrl (i.e. URL was replaced by Url everywhere)</li>
<li>void toolbarCallback(int) was removed</li>
<li>void pathComboChanged( const QString&amp; ); was removed</li>
<li>void dirCompletion( const QString&amp; ); was removed</li>
<li>void setFilterMimeType(const QString &amp;label, const KMimeType::List &amp;types, const KMimeType::Ptr &amp;defaultType) was removed</li>
<li>void setPreviewWidget(const QWidget *w) was removed</li>
<li>void updateStatusLine(int dirs, int files); was removed</li>
<li>protected member locationEdit is now a method locationEdit()</li>
<li>protected member filterWidget is now a method filterWidget()</li>
<li>getExistingUrl -&gt; getExistingDirectoryUrl</li>
</ul>

<h4>KFileIconView, KFileDetailView, KFileTreeView, KFileTreeViewItem</h4>
<ul>
<li>All renamed to K3File* since they are based upon K3IconView and K3ListView</li>
<li>No replacement yet, apart from the more low-level KDirModel</li>
<li>Those classes have all moved to a new library, libkfile. You need to link to ${KDE4_KFILE_LIBS} to keep using those classes.</li>
</ul>

<h4>KFileItemList</h4>
<ul>
  <li>KFileItemList has been ported from QPtrList to QList. This means you
      have to iterate using either integers or java-style or STL iterators.
      Here's the STL version:
   <pre>
    KFileItemList::const_iterator kit = list.begin();
    const KFileItemList::const_iterator kend = list.end();
    for ( ; kit != kend; ++kit )
       ...
    </pre></li>
   <li>Note however that no loop is necessary anymore for finding an item by name (use findByName), finding an item by URL (use findByURL) or making a list of all urls (use urlList).</li>
</ul>

<h4>KFileMetaInfo</h4>

<p>KFileMetaInfo has a new API and a new implementation. The change moves the emphasis away from mimetypes and groups of metadata to individual properties of files. These properties are still called KFileMetaInfoItem. The no longer belong to a group; they belong to the KFileMetaInfo object. The class KFileMetaInfoGroup is only there to group the items. Each KFileMetaInfoItem now has a member called PredicateProperties. This term comes from RDF. It determines the type of the item. This type encompasses the key (a URI), a name in the current locale, a description in the current locale, a type and a QValidator.
</p>

<h4>KFileOpenWithHandler</h4>
<ul>
<li>This class has been removed, it was just a workaround for a dependency problem,
just remove any instance of it.</li>
</ul>

<h4>KFilePlugin</h4>

<p>This class has been replaced by <a href="http://techbase.kde.org/Development/Tutorials/Writing_file_analyzers">Strigi analyzers</a> and KFileWritePlugin. The Strigi analyzer should be installed in the directory lib/strigi to be picked up. Introspection provided by the factories that are defined in the plugin helps in determining when a particular analyzer will be used.</p>

<p>Strigi analyzer have the advantage that they are faster than KFilePlugins. In addition, having one mechanism for extracting metadata from files saves code and more importantly ensures consistency between the display of metadata and the ablility to search in it. Another advantage is that the way the metadata are described matches well with the methods employed in the semantic desktop, in particular Nepomuk.</p>

<h3>How to convert a KFilePlugin?</h3>

<p>If your KFilePlugin only reads from files, it is easiest. Then you have to write only a Strigi analyzer. Depending on the way you read the data from the file it is best to write either a StreamThroughAnalyzer or a StreamEndAnalyzer. How to make the decision is explained in the link above. When your analyzer is ready you have to decide where to put it. You can put it in the same place as the KFilePlugin was or, if there are little or no dependencies in your analyzer, you can put it in kdesupport/strigi/src/streamindexer. The latter option has the advantage that you do not have to add the code for loading a plugin.</p>

<p>When you have write functionality in your plugin, you must implement KFileWritePlugin and place the code for writing the file in there. The details of how to do this are not entirely clear at the moment as is explained in the entry for KFileWritePlugin.</p>

<h4>KFileWritePlugin</h4>

<p>The write functionality of the class KFilePlugin is now handled by KFileWritePlugin. A global instance of this class that is attached to a KFileMetaInfoItem can be used to write back changes that were made to a files' metadata.</p>

<p>The mechanism by which these global instances are tied to KFileMetaDataItems is not yet finished. The implementation of will go into kio/kio/kfilemetainfo.cpp.</p>

<h4>KIconButton</h4>
<ul>
<li>signal void iconChanged(QString); replaced by void iconChanged(const QString &amp;);</li>
</ul>

<h4>KIconDialog</h4>
<ul>
<li>signal void newIconName(QString); replaced by void newIconName(const QString &amp;);</li>
</ul>

<h4>KImageIO classes</h4>
<ul>
<li>The KImageIO plugins are converted to Qt's imageformat plugins. The KImageIO class
now a lightweight version to query the installed plugins without actually loading them.
</li>
<li>.kimgio files are converted to .desktop files, and contains regular KDE services,
with ServiceType as QImageIOPlugins</li>
<li>KImageIO::registerFormats() removed, simply remove this from your code</li>
<li>Instead of mimeType(filename), you should use KMimeType</li>
<li>Instead of canRead() and canWrite() you can use types(mode).contains(typename)</li>
</ul>

<h4>KIO:: global methods</h4>
<ul>
<li>KIO::convertSizeFromKB is now KIO::convertSizeFromKiB since it takes a value in KiB (1 KiB = 1024 B)</li>
<li>KIO::findDeviceMountPoint() has been replaced with KMountPoint::currentMountPoints() and findByDevice()</li>
<li>KIO::findPathMountPoint() has been replaced with KMountPoint::currentMountPoints() and findByPath()</li>
<li>KIO::probably_slow_mounted() has been replaced with KMountPoint::currentMountPoints(), findByPath(), and probablySlow()</li>
<li>KIO::testFileSystemFlag() has been replaced with KMountPoint::testFileSystemFlag() (use KMountPoint::currentMountPoints().findByPath())</li>
</ul>

<h4>KIO::Job</h4>
<ul>
<li>For Job subclasses: removeSubjob doesn't terminate the parent job anymore, add
<code>if ( !hasSubjobs() ) emitResult();</code> to emulate the old behavior that.</li>
<li>subjobs is now private. This means you should replace subjobs.remove(job) with removeSubjob(job),
and subjobs.isEmpty() with !hasSubjobs()</li>
<li><code>job-&gt;showErrorDialog(QWidget*)</code> becomes <code>job-&gt;ui()-&gt;showErrorMessage()</code>. The parent QWidget should be set immediately after creating the job by <code>job-&gt;ui()-&gt;setWindow(QWidget*)</code></li>
<li><code>job-&gt;setAutoErrorHandlingEnabled(bool,QWidget*)</code> becomes <code>job-&gt;ui()-&gt;setAutoErrorHandlingEnabled(bool)</code></li>
<li><code>job-&gt;isAutoErrorHandlingEnabled()</code> becomes <code>job-&gt;ui()-&gt;isAutoErrorHandlingEnabled()</code></li>
<li><code>job-&gt;setAutoWarningHandlingEnabled(bool)</code> becomes <code>job-&gt;ui()-&gt;setAutoWarningHandlingEnabled(bool)</code></li>
<li><code>job-&gt;isAutoWarningHandlingEnabled()</code> becomes <code>job-&gt;ui()-&gt;isAutoWarningHandlingEnabled()</code></li>
<li><code>job-&gt;setWindow(QWidget*)</code> becomes <code>job-&gt;ui()-&gt;setWindow(QWidget*)</code></li>
<li><code>job-&gt;window()</code> becomes <code>job-&gt;ui()-&gt;window()</code></li>
<li><code>job-&gt;setInteractive( false )</code> becomes <code>job-&gt;setUiDelegate( 0 )</code></li>
<li>Also note that you must now include &lt;kio/copyjob.h&gt; if you use KIO::copy, KIO::move or KIO::trash,
and you must include &lt;kio/deletejob.h&gt; if you use KIO::del.</li>
<li>For Job subclasses, there's no showProgressInfo flag in the constructor anymore. You should use KIO::getJobTracker()-&gt;registerJob(job) instead.</li>

<li>Most boolean parameters have been replaced with enums. So for instance
  <ul>
     <li>KIO::file_copy(src, dest, -1, true /*overwrite*/, false /*no resume*/, false) -&gt; KIO::file_copy(src, dest, -1, KIO::Overwrite | KIO::HideProgressInfo)</li>
     <li>KIO::get(url, false /*no reload*/, false) -&gt; KIO::get(url, KIO::NoReload, KIO::HideProgressInfo)</li>
     <li>KIO::put(url, -1, true /*overwrite*/, false /*no resume*/, false) -&gt; KIO::put(url, -1, KIO::Overwrite | KIO::HideProgressInfo)</li>
     <li>KIO::del(url, false /*shred, feature removed*/, false) -&gt; KIO::del(url, KIO::HideProgressInfo)</li>
     <li>KIO::listDir(url, true /*show progress info*/, true /*include hidden files*/) -&gt; KIO::del(url, KIO::DefaultFlags, true /*include hidden files*/)</li>
  </ul>
</li>
</ul>

<h4>KIO::UDSEntry</h4>
<ul>
<li>UDSEntry is now a hash-based class instead of a list. Use the methods stringValue()
and numberValue() to retrieve fields directly, no loop is needed anymore.
See the UDSEntry documentation for code examples.</li>
<li>Also note that UDSEntryListConstIterator is now UDSEntryList::ConstIterator;
see the UDSEntryList documentation for a full code example of iterating through
a listDir result.</li>
<li>For kioslaves: replace every three lines like
 <pre>atom.m_uds = KIO::UDS_SIZE;
      atom.m_long = buff.st_size;
      entry.append( atom );</pre>
  with the line <pre>entry.insert( KIO::UDSEntry::UDS_SIZE, buff.st_size );</pre></li>
</ul>


<h4>KIO::RenameDialog</h4>
<ul>
<li>KIO::RenameDlg was renamed to KIO::RenameDialog and the header moved from renamedlg.h to renamedialog.h</li>
<li>void b0Pressed() renamed to void cancelPressed()</li>
<li>void b1Pressed() renamed to void renamePressed()</li>
<li>void b2Pressed() renamed to void skipPressed()</li>
<li>void b3Pressed() renamed to void autoSkipPressed()</li>
<li>void b4Pressed() renamed to void overwritePressed()</li>
<li>void b5Pressed() renamed to void overwriteAllPressed()</li>
<li>void b6Pressed() renamed to void resumePressed()</li>
<li>void b7Pressed() renamed to void resumeAllPressed()</li>
<li>void b8Pressed() renamed to void suggestNewNamePressed()</li>
</ul>

<h4>KIO::RenameDialogPlugin</h4>
<ul>
<li>RenameDlgPlugin was renamed to KIO::RenameDialogPlugin and the header moved from renamedlgplugin.h to renamedialogplugin.h</li>
<li>The ServiceType was changed from RenameDlg/Plugin to RenameDialog/Plugin. Make sure to update your .desktop fiel</li>
</ul>

<h4>KIO::PasswordDialog</h4>
<ul>
<li>KIO::PassDlg was renamed to KIO::PasswordDialog and the header moved from passdlg.h to passworddialog.h</li>
</ul>

<h4>KIO::PreviewJob</h4>
<ul>
  <li>KIO::PreviewJob works with KFileItems by value rather than by pointer, now that KFileItem is refcounted.</li>
  <li>The two signals changed accordingly:
    <ul>
      <li>gotPreview(const KFileItem*, const QPixmap&amp;) -&gt; gotPreview(const KFileItem&amp;, const QPixmap&amp;)</li>
      <li>failed(const KFileItem*) -&gt; failed(const KFileItem&amp;</li>
    </ul>
  </li>
  <li>In the slots connected to those signals, don't compare KFileItem pointers! If you need to find the KFileItem
      in a list, compare the url() of the items in the list with the url() of the item passed to the slot.</li>
</ul>

<h4>KIO::SkipDialog</h4>
<ul>
<li>KIO::SkipDlg was renamed to KIO::SkipDialog and the header moved from skipdlg.h to skipdialog.h</li>
</ul>

<h4>KIO::Observer</h4>
<ul>
<li>openPassDlg was renamed to openPasswordDialog</li>
<li>open_RenameDlg to open_RenameDialog</li>
<li>open_SkipDlg to open_SkipDialog</li>
</ul>

<h4>KIO::SlaveBase</h4>
<ul>
<li>openPassDlg was renamed to openPasswordDialog</li>
</ul>

<h4>KIO::TCPSlaveBase</h4>
<ul>
<li>Removed distinction of SSL and TLS mode. You can now tell the slave via the constructor to start SSL right after connecting which is what was previously called "SSL mode". "TLS" is the same as starting SSL (using startSsl()) later than immediately after connecting. You can query if a slave was created with immediate SSL start enabled by calling isAutoSsl().</li>
<li>Removed the notion of a default port. It was not used for any internal calculations - you can emulate it simply by having an "m_defaultPort" or similar member in a subclass.</li>
<li>Renamed isConnectionValid() to isConnected().</li>
<li>Renamed setBlockConnection() to setBlocking().</li>
<li>Renamed closeDescriptor() to disconnectFromHost().</li>
<li>startSsl() (formerly startTLS()) now just returns a bool instead of a numeric error code.</li>
<li>connectToHost() lost its sendError parameter. It was only used for proxy support hacks in the HTTP ioslave and nowhere else. Proxy support is better implemented inside TCPSlaveBase than in protocol slaves.</li>
<li>Metadata changes that should only concern the HTTP ioslave and the HTML KPart.</li>
</ul>

<h4>KMimeMagic</h4>
<ul>
<li>The KMimeMagic class is gone. Use the KMimeType API instead:
<ul>
  <li>KMimeMagic::self()-&gt;findFileType(path) -&gt; KMimeType::findByPath(path) (preferred) or KMimeType::findByFileContent(path) (if only the content should be considered, but this isn't always reliable)</li>
  <li>KMimeMagic::self()-&gt;findBufferType(data) -&gt; KMimeType::findByContent(data)</li>
  <li>KMimeMagic::self()-&gt;findBufferFileType(data,name) -&gt; KMimeType::findByNameAndContent(name,data)</li>
</ul>
</li>
<li>.. and replace result-&gt;mimeType() with mime-&gt;name().</li>
</ul>

<h4>KMimeType</h4>
<ul>
<li>KMimeType::pixmap() has been deprecated (for core/gui separation), use iconName() or iconName(url)
and KIconLoader::loadMimeTypeIcon with that icon name.</li>
<li>KMimeType::pixmapForURL -&gt; KIO::pixmapForURL</li>
<li>KMimeType::comment(KUrl,bool) -&gt; KIO::comment(KUrl)</li>
<li>KMimeType::diagnoseFileName has been replaced with KMimeType::extractKnownExtension which returns the extension only, not the pattern</li>
<li>KMimeType::mimeType(someName) now behaves like KServiceType::serviceType(someName), i.e. it returns 0 if that name doesn't exist,
instead of returning the application/octet-stream mimetype. Test for null!</li>
<li>iconForURL has removed, use iconNameForURL instead</li>
<li>KMimeType::findFormatByFileContent has been removed. Use KMimeType::isBinaryData instead.</li>
</ul>

<h4>KMimeTypeResolver</h4>
<ul>
<li>The previous KMimeTypeResolver has been renamed to K3MimeTypeResolver.</li>
<li>A new KMimeTypeResolver must be used together with a KDirModel.</li>
</ul>

<h4>KOpenWithDlg</h4>
<ul>
<li>Has been renamed to KOpenWithDialog. Use #include &lt;kopenwithdialog.h&gt;</li>
</ul>

<h4>KPropertiesDialog</h4>
<ul>
<li>Doesn't have autoShow support in its constructors anymore, but still has autodelete behavior.</li>
<li>Ensure any new is followed by show or exec. Or use KPropertiesDialog::showDialog where possible.</li>
<li>The header file was renamed from kpropsdlg.h to kpropertiesdialog.h
<li>The ServiceType was renamed from KPropsDlg/Plugin to KPropertiesDialog/Plugin. Make sure to update your .desktop files </li>
</ul>

<h4>KPropertiesDialogPlugin</h4>
<ul>
<li>KPropsPage or KPropsDlgPlugin was renamed to KPropertiesDialogPlugin</li>
<li>The header file was renamed from kpropsdlg.h to kpropertiesdialog.h</li>
</ul>

<h4>KProtocolInfo</h4>
<ul>
<li>Many static methods have been moved to KProtocolManager (which is in kio)
so that kprotocolinfo itself could be moved to kdecore:
  <ul>
    <li>KProtocolInfo::supportsListing(url or protocol) -&gt; KProtocolManager::supportsListing(url)</li>
    <li>KProtocolInfo::supportsReading(url or protocol) -&gt; KProtocolManager::supportsReading(url)</li>
    <li>KProtocolInfo::supportsDeleting(url or protocol) -&gt; KProtocolManager::supportsDeleting(url)</li>
    <li>etc.</li>
  </ul>
</li>
<li>The deprecated methods taking a QString protocol as input have been removed, make sure
to pass a KUrl to most methods instead.</li>
</ul>

<h4>KRun</h4>
<ul>
<li>the constructor needs a second parameter (a widget) now</li>
</ul>

<h4>KURLBar</h4>
<ul>
<li>renamed to KUrlBar</li>
</ul>

<h4>KURLComboBox</h4>
<ul>
<li>Renamed to KUrlComboBox</li>
<li>All usage of QPixmap has been replaced by usage of QIcon</li>
<li>getPixmap() --&gt; getIcon()</li>
</ul>

<h4>KURLCompletion</h4>
<ul>
<li>Renamed to KUrlCompletion</li>
</ul>

<h4>KURLPixmapProvider</h4>
<ul>
<li>Renamed to KUrlPixmapProvider</li>
</ul>

<h4>KURLRequester</h4>
<ul>
<li>renamed to KUrlRequester</li>
<li>setCaption is gone, use setWindowTitle instead</li>
<li>Renamed setURL() to setUrl(), per KDE naming policy</li>
<li>Ported to use KUrl instead of QString.  Thus, the constructors, setUrl(), url(), and urlChanged() all use KUrl.</li>
<li>Removed showLocalProtocol() and setShowLocalProtocol(); this is now always false (the user never sees file:///)</li>
</ul>

<h4>KService</h4>
<ul>
<li>KService was moved to libkdecore</li>
<li>KService::rebuildKSycoca -&gt; KBuildSycocaProgressDialog::rebuildKSycoca</li>
<li>KService::pixmap was removed due to icon support being moved to libkdeui. Instead use KService::icon() and KIconLoader directly. Usually you can simply use the KIconLoader returned by KApplication::iconLoader() for this.</li>
</ul>

<h4>KServiceType</h4>
<ul>
<li>KServiceType::offers() -&gt; KServiceTypeTrader::self()-&gt;query()</li>
<li>The behavior of KServiceType::serviceType() has changed: it now only returns real service types, and no more mimetypes. For mimetypes, use KMimeType::mimeType().</li>
<li>Similarly, allServiceTypes() only returns real service types, no more mimetypes.</li>
</ul>

<h4>KServiceTypeProfile</h4>
<ul>
<li>This class has been moved to kservicetypeprofile.h and is mostly internal now. Use KServiceTypeTrader or KMimeTypeTrader instead.</li>
<li>KServiceTypeProfile::preferredService is now KMimeTypeTrader::self()-&gt;preferredService or KServiceTypeTrader::self()-&gt;preferredService</li>
<li>KServiceTypeProfile::offers is now KMimeTypeTrader::self()-&gt;query or KServiceTypeTrader::self()-&gt;query</li>
</ul>

<h4>KTrader</h4>
<ul>
<li>KTrader has been split up into two classes: KServiceTypeTrader and KMimeTypeTrader.</li>
<li>So KTrader::query() should be ported to KMimeTypeTrader::query() when it's about mimetypes
(finding the application or part for a given mimetype), and to KServiceTypeTrader::query() when
it's about pure service types (plugins, kcmodules, etc.)</li>
<li>In other terms, KTrader::query(1 or 2 args) -&gt; KServiceTypeTrader::query and
                    KTrader::query(4 args but the last one was always QString::null) -&gt; KMimeTypeTrader::query</li>
<li>In both cases, query() now returns KService::List instead of an OfferList, adjust the type of the variable</li>
<li>Constraints like "'RenameDlg/Plugin' in ServiceTypes" should be turned into
  KMimeTypeTrader::self()-&gt;query(mimetype,"RenameDlg/Plugin")</li>
</ul>

<h4>PasswordDialog</h4>
<ul>
  <li>void setEnableUserField( bool enable, bool=false ) removed use setUsernameReadOnly( !enable )</li>
</ul>


<h4>UIServer</h4>
<ul>
  <li>QByteArray openPassDlg( const KIO::AuthInfo &gt;info ); removed. Use KIO::PasswordDialog::getNameAndPassword</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kparts">Changes in kparts</a></h3>

<h4>BrowserExtension</h4>
<ul>
<li>The following signals have changed:
  <ul>
      <li>openUrlRequest(const KUrl &amp;, const KParts::URLArgs&amp;) -&gt; openUrlRequestDelayed(const KUrl &amp;, const KParts::OpenUrlArguments&amp;, const KParts::BrowserArguments&amp;)</li>
      <li>openUrlRequestDelayed(const KUrl &amp;, const KParts::URLArgs&amp;) -&gt; openUrlRequestDelayed(const KUrl &amp;, const KParts::OpenUrlArguments&amp;, const KParts::BrowserArguments&amp;)</li>
      <li>The two createNewWindow signals have been merged into a single one: createNewWindow(url, args, browserArgs [, windowArgs, &amp;part] )</li>
      <li>The popupMenu signals have been greatly simplified, 2 signals instead of 5. URLArgs has been split into OpenUrlArguments and BrowserArguments; the KXMLGUIClient argument has been removed, and the ActionGroupMap mechanism replaces it.</li>
  </ul>
</li>
<li>Because of the URLArgs split, make sure to replace BrowserExtension::setUrlArgs with BrowserExtension::setBrowserArguments + part-&gt;setArguments</li>
</ul>

<h4>BrowserHostExtension</h4>
<ul>
<li>The following virtal methods have changed:
  <ul>
      <li>openURLInFrame(const KUrl &amp;, const KParts::URLArgs&amp;) -&gt; openUrlInFrame(const KUrl &amp;, const KParts::OpenUrlArguments&amp;, const KParts::BrowserArguments&amp;)</li>
  </ul>
</li>
</ul>

<h4>BrowserRun</h4>
<ul>
    <li>The constructor now takes args and browserArgs, see KParts::Part</li>
    <li>All the protected members have been turned into methods</li>
    <li>BrowserRun::isExecutable obsoleted by KRun::isExecutable</li>
    <li>suggestedFilename -&gt; suggestedFileName</li>
</ul>

<h4>ComponentFactory</h4>
<ul>
<li>createInstanceFromFactory is now KPluginFactory::create&lt;T&gt;</li>
<li>createInstanceFromLibrary is now KLibLoader::createInstance&lt;T&gt;</li>
<li>createInstanceFromService is now KService::createInstance&lt;T&gt;</li>
<li>createInstanceFromQuery is now KServiceTypeTrader::createInstanceFromQuery&lt;T&gt;</li>
<li>All the error codes like KParts::ComponentFactory::ErrNoServiceFound have moved to KLibLoader</li>
</ul>

<h4>KParts::URLArgs</h4>
<ul>
<li>URLArgs has been splitted into OpenUrlArguments and BrowserArguments.
  <ul>
      <li>URLArgs.reload -&gt; OpenUrlArguments.reload()/setReload()</li>
      <li>URLArgs.xOffset -&gt; OpenUrlArguments.xOffset()/setXOffset()</li>
      <li>URLArgs.yOffset -&gt; OpenUrlArguments.yOffset()/setYOffset()</li>
      <li>URLArgs.serviceType -&gt; OpenUrlArguments.mimeType()/setMimeType()</li>
      <li>URLArgs.metaData() -&gt; OpenUrlArguments.metaData()</li>
      <li>For anything else (docState, frameName, postData, setDoPost, setContentType etc.): URLArgs -&gt; BrowserArguments</li>
  </ul>
</li>
<li>The BrowserArguments are still set and retrieved from the BrowserExtension, however the OpenUrlArguments are simply stored in KParts::ReadOnlyPart. So for instance:
  <ul>
      <li>m_extension-&gt; urlArgs().xOffset -&gt; arguments().xOffset()</li>
  </ul>
  </li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kded">Changes in kded</a></h3>

<ul>
 <li>The class KDEDModule is now part of libkdecore so that kded modules can link without undefined symbols.
  A number of apparently unused methods in KDEDModule have been commented out, contact
  kde-core-devel if you need those after all.</li>
 <li>Note that the signature for the create_xyz() call has changed, simply remove all arguments from it,
  and from your kded module's constructor</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kspell">Changes in kspell</a></h3>

<h4>KSpell</h4>

<ul>
<li>All of the features of KSpell and KSpell2 have been moved to Sonnet</li>
<li>The KSpell2's initialization procedure of:
<pre>
KSpell2::Loader::Ptr loader = KSpell2::Loader::openLoader();
KSpell2::Speller *speller = loader-&gt;createSpeller("en_US");
if (speller) {
   if (speller-&gt;isMisspelled("word")) {
          //do something
   }
}
</pre>
has been replaced with:
<pre>
Sonnet:Speller speller("en_US");
if (speller.isMisspelled("word")) {
    //do something
}
</pre>
</li>
<li>The configuration class of KSpell2 (KSpell2::Settings) have been
folded back into Sonnet::Speller.</li>
<li>Sonnet doesn't automatically overwrite configuration anymore. To
  save and restore setting from a KConfig file one has to use
<pre>
  Sonnet::Speller::save(KConfig *config);
  Sonnet::Speller::restore(KConfig *config);
</pre>
methods.</li>
<li>KSpell2::Filter has been temporarily removed from the public api.
Proper text segmentation api is planned for KDE 4.1</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kdnssd">Changes in kdnssd</a></h3>

<h4>DomainBrowser</h4>
<ul>
<LI>Recursive browsing feature has been removed removed</LI>
<li>Constructor that takes list of domains and does not use configuration has been removed</li>
<li>It is now possible to search for browsing or publishing domains</li>
</ul>

<h4>ServiceBase</h4>
<ul>
<LI>Service properties are stored in QMap&lt;QString,QByteArray&gt; instead of QMap&lt;QString,QString&gt;.</LI>
<LI>This class is not used to pass domains or service types anymore</LI>
</ul>

<h4>ServiceBrowser</h4>
<ul>
<LI>Browsing multiple types or multiple domains at once has been removed</LI>
<li>In KDE3 ServiceBrowser created with default constructor (for example ServiceBrowser("_http._tcp") ) browsed all configured domains. Now it only browses default one. To browse other domains create more ServiceBrowser objects</li>
<li>It is now possible to specify subtype to narrow searching scope (for example "anon" for only anonymous FTP servers)</li>
<li>Browsing for service types is now done using new class ServiceTypeBrowser</li>
</ul>

<h4>RemoteService</h4>
<ul><LI>Creating RemoteService from URL or DNS label is no longer supported</LI></ul>

<h4>PublicService</h4>
<ul>
<LI>Optional list of subtypes can be passed to constructor.</LI>
<li>Encoding service into URL is no longer supported</li>
</ul>

<h4>Query</h4>
<ul>
<LI>This class has been merged into ServiceBrowser</LI></ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="khtmlpart">API-cleanups in KHTML</a></h3>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kfile">Changes in kfile</a></h3>

<h4>KUrlRequesterDialog</h4>
<ul>
<li>KUrlRequesterDlg was renamed to KUrlRequesterDialog</li>
<li>The header was renamed from kurlrequesterdlg.h to kurlrequesterdialog.h</li>
</ul>

<h4>KDirOperator</h4>
<ul>
<li>KFileView* view() const -&gt; QAbstractItemView* view() const</li>
<li>void setView(KFileView *view) -&gt; void setView(QAbstractItemView *view)</li>
<li>const KFileItemList* selectedItems() const -&gt; QList&lt;KFileItem&gt; selectedItems() const</li>
<li>KFileView* createView(QWidget *parent, KFile::FileView view) -&gt; QAbstractItemView* createView(QWidget *parent, KFile::FileView view)</li>
<li>QWidget* viewWidget() const; has been removed, use QAbstractItemView* view() instead.</li>
<li>void setPreviewWidget(const QWidget *w) -&gt; void setPreviewWidget(KPreviewWidgetBase *w)</li>
<li>KIO::DeleteJob* del(const KFileItemList&amp; items, QWidget *parent,
bool ask = true, bool showProgress = true) -&gt; KIO::DeleteJob* del(const QList&lt;KFileItem&gt;&amp; items, QWidget *parent = 0,
bool ask = true, bool showProgress = true)</li>
<li>KIO::DeleteJob* del(const KFileItemList&amp; items, bool ask = true, bool showProgress = true) has been removed. Use del(...)
with parent parameter instead.</li>
<li>KIO::CopyJob* trash(const KFileItemList&amp; items, QWidget *parent,
bool ask = true, bool showProgress = true) -&gt; KIO::CopyJob* trash(const QList&lt;KFileItem&gt;&amp; items, QWidget *parent,
bool ask = true, bool showProgress = true)
</ul>

<h4>KFileView</h4>
<ul>
  <li>KFileView doesn't exist anymore, see the new itemview based KDirOperator.</li>
  <li>For ease of porting, kde3support provides K3FileView, but don't expect it to still be useable in a KDirOperator.</li>
</ul>

<h4>KFileWidget</h4>
<ul>
<li>void setPreviewWidget(const KPreviewWidgetBase *w) -&gt; void setPreviewWidget(KPreviewWidgetBase *w)</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kdesu">Changes in kdesu</a></h3>

All classes of kdesu are now in the <tt>KDESu</tt> namespace


<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kcontrol">Changes in KControl</a></h3>
<ul>
  <li>The Button enum in KCModule only contains the Help, Default and Apply
  values. The other buttons are not optional. If your KCM specified the button
  flags just remove everything except those three.</li>
  <li>The functions setRootOnlyMsg, rootOnlyMsg, setUseRootOnlyMsg and
  useRootOnlyMsg have been renamed to
  setRootOnlyMessage, rootOnlyMessage, setUseRootOnlyMessage and
  useRootOnlyMessage.</li>
  <li>KCModules need to have Type=Service and ServiceTypes=KCModule in the
  .desktop file now - was Type=Application before</li>
  <li>KCModules that should show up in KControl or kcmshell --list need to have
  X-KDE-ParentApp=kcontrol or kinfocenter</li>
  <li>If the KCModule should be used by kcminit you have to add KCModuleInit to
  ServiceTypes (i.e. ServiceTypes=KCModule,KCModuleInit then)</li>
  <li>The kcm_ prefix in X-KDE-Library is now optional (in KDE3 the
  X-KDE-Library value was automatically prefixed with kcm_)</li>
  <li>If the kcminit code is in a different lib than the other KCM code the
  X-KDE-Init-Library was used. The library name has to be prefixed with kcminit_
  now, but the prefix is optional in the .desktop file.</li>
  <li>The kcminit symbol now has to be prefixed with kcminit_ (in the code). The
  rest of the symbol name is specified with X-KDE-Init-Symbol (was X-KDE-Init
  before).</li>
  <li>It is now possible to use multiple K_EXPORT_GENERIC_FACTORY calls in one
  library. The first parameter to the macro has to be the same as
  X-KDE-FactoryName then.</li>
  <li>KCModule does no longer take a name argument, but directly a KInstance (having the correct
  name for the translations to work.</li>
  <li>The X-KDE-RunAsRoot and X-KDE-IsHiddenByDefault keys are removed.</li>
  <li>KCModules will not be embedded running with root privileges anymore.
  Instead the GUI code will run with user privileges as every other KCM. Only in
  order to write or call programs should the KCM elevate its privileges.</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kicker">Panel Applets and Extensions</a></h3>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<!-- ### TODO: should this not be a KDE3SUPPORT <h3> section? -->
<ul>
<li>KDockWidgets -&gt; kde3support K3DockWidget</li>
<li>KParts::DockWindow -&gt; kde3support KParts::DockWindow3</li>
<li>KMDI* --&gt; kdeSupport K3MDI*</li>
</ul>

<h3>libkmid</h3>
<ul>
<li>Moved to kdemultimedia, where (at the moment) it is only used by kmid.</li>
</ul>

<h3><a name="kscreensaver">KScreensaver</a></h3>

<h4>libkscreensaver</h4>
<ul>
<li>Moved to kdebase/workspace/kscreensaver</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="i18n">I18N</a></h3>

<h4>Messages.sh files</h4>
<p>Instead of the "messages" target of the Makefile.am files,
KDE4 uses now Bash scripts with Messages.sh file names.
The Perl script trunk/l10n-kde4/scripts/conversion/Makefile2Messages.pl
can be used as an half-automatic conversion. (Please verify the result!)</p>

<h4>rc.cpp file</h4>
<p>The rc.cpp is now <em>always</em> generated. It is mandatory to have it as
parameter of the $XGETTEXT if you are using the class KAboutData and if
you are not explicitly setting KAboutData::setTranslator.</p>

<h4>Gettext 0.16.1</h4>
<p>Scripty uses
<a href="http://gnu.org/software/gettext/gettext.html">xgettext 0.16.1</a>
for extracting
messages out of the source code. This is a huge step from the former xgettext 0.10.35-kde
used in KDE3.</p>
<p>Important changes:</p>
<ul>
<li>If you define your own keywords (-k parameter of xgettext), you probably
need to adapt them, as xgettext does not automatically know about the
1, 2 or 3 parameter versions.</li>
<li>You cannot have two similar messages, one being a normal message and
the other being the singular form of a plural-form message. For Gettext, this is
the same message and therefore this creates problems. (Note: there is not
any similar problem with contexts.)</li>
</ul>

<h4>Translator Comments</h4>

<p>Translator comments are a feature that already existed in KDE3, but which
was seldom used.</p>
<ul>
<li>Translator comment are code comments before a i18n call. To avoid
extracting comments that are of little interest for translators, translator
comemnts must start with // i18n: or /* i18n: to mark such comments.
(Note: translator comments starting with TRANSLATORS (all upper case), as it is Gettext's habit are not supported by KDE4.)</li>
<li>As in Gettext 0.16.1, contexts are supposed to be short, please consider
using a translator comment instead of a context to give long hints to translators.</li>
</ul>
<pre>
// i18n: this is a test sentence
i18n("The quick brown fox jumps over the lazy dog");
</pre>

<h4>i18n calls</h4>

<p>The basic call, a message without arguments, context or plural, remains as is:</p>
<pre>
i18n("Just plain info");
</pre>

<p>If there are arguments, <code>arg</code> methods are no longer used to substitute the placeholders. Instead, arguments are added to the call:</p>
<pre>
i18n("%1 has scored %2", playerName, score);
</pre>
<p>Arguments can be of several integer types, <code>double</code>, <code>QString</code>, <code>QChar</code> (and perhaps more in the future).</p>

<p>Context call now has a different name, <code>i18nc</code>, and takes arguments in the same way:</p>
<pre>
i18nc("Player name - score", "%1 - %2", playerName, score);
</pre>

<p>Plural call is renamed to <code>i18np</code> and does away with <code>%n</code> placeholder, all being numbered instead:</p>
<pre>
i18np("One image in album %2", "%1 images in album %2", n, albumName);
</pre>
<p>The plural form is decided by first integer-valued argument.</p>

<p>There is one new call variant, the context-plural call:</p>
<pre>
i18ncp("Personal file", "One file", "%1 files", n);
</pre>

<p><code>i18n*</code> calls are realized as templates, and so will take at most some finite number of arguments.</p>

<p>Notes on placeholder substitution:</p>
<ul>
<li>Placeholders are substituted in one pass, so no need to worry about argument itself containing a placeholder.</li>
<li>All same-numbered placeholders are substituted with same argument. This is in contrast to what single-argument <code>arg</code> methods of <code>QString</code> do.</li>
<li>Placeholders directly index arguments: they should be numbered from 1 upwards, without gaps in the sequence so that each argument is indexed. The exception is plural-deciding argument in plural call, where it is allowed to drop its placeholder in either singular or plural form.</li>
</ul>

<p>Sometimes you might need old-style syntax for argument substitution. For example, when there are many arguments, or, more importantly, when it is convenient to <i>defer</i> substitution of arguments. This is possible using new <code>ki18n</code> call, with <code>subs</code> methods for argument substitution and <code>toString</code> method for finalization:</p>
<pre>
KLocalizedString ks = ki18n("The Foo-machine reported: %1");
case (fooErrCode) {
    ERR_OXI: ks.subs(i18n("Out of oxidizer")); break;
    ERR_HYD: ks.subs(i18n("Out of hydrazine")); break;
    ERR_PIL: ks.subs(i18n("Out of pilots")); break;
    default: ks.subs(i18n("Unknown catastrophe"));
}
QString scream = ks.toString();
</pre>

<p>Note that <code>ki18n</code> returns object of type <code>KLocalizedString</code>, hence the <code>toString</code> method for conversion to plain <code>QString</code>. The <code>ki18n</code> call should be used rarely; the previous example can as well be rewritten to:</p>
<pre>
QString problem;
case (fooErrCode) {
    ERR_OXI: problem = i18n("Out of oxidizer"); break;
    ...
}
QString scream = i18n("The Foo-machine reported: %1", problem);
</pre>

<p>Another case when you might want to use <code>ki18n</code> is if you want to format arguments. <code>subs</code> methods can take formatting arguments, similar to those of <code>arg</code> methods in <code>QString</code>. You should <i>never</i> use methods other than <code>subs</code> to format numbers in localized messages:</p>
<pre>
i18n("Rounds: %1", myNumberFormat(n, 8)); // bad, number not localized
ki18n("Rounds: %1").subs(n, 8).toString(); // good, number is localized
</pre>

<p>There is a context, plural and context-plural variant of <code>ki18n</code> as well:</p>
<pre>
ki18nc("No function", "None").toString();
ki18np("One file found", "%1 files found").subs(n).toString();
ki18ncp("Personal file", "One file", "%1 files").subs(n).toString();
</pre>

<p>If you need translation using locale (KLocale object) other than the default, you can use overloaded <code>toString</code> method which takes pointer to locale object (this replaces <code>KLocale::translate(...)</code> from KDE3):</p>
<pre>
KLocale *myLocale;
...
ki18n("Welcome").toString(myLocale);
</pre>

<p>There is a script for semi-automatic conversion of KDE 3 code, <code>i18nk34conv.pl</code> in <code>trunk/l10n-kde4/scripts/conversion/</code>. It will convert most of the calls automatically, and mark the places that need manual review. There is also the script <code>i18ncheckarg.pl</code> in <code>trunk/l10n-kde4/scripts/conversion/</code>, which will check whether placeholders and arguments match. Use it to catch and correct deferred substitutions (like in the examples above). Both these scripts you can just run without any arguments in top directory of your sources (but you can also specify paths or filenames as arguments). <i>Do not</i> run conversion script twice on same sources!</p>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="kssl">Changes in KSSL</a></h3>

<h4>KSSLCertDialog</h4>
<ul>
<li>KSSLCertDlg was renamed to KSSLCertDialog. The header was renamed to ksslcertdialog.h</li>
</ul>

<h4>KSSLInfoDialog</h4>
<ul>
<li>KSSLInfoDlg was renamed to KSSLInfoDialog</li>
<li>ksslinfodlg.h was moved to ksslinfodialog.h</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="mimetypes">Changes in mime types names</a></h3>

<p>KDE 4 switched to the XDG mime types, thus the names for some mime types have changed.</p>

<p>The following list contains the renamings from the KDE mime types to the XDG ones.</p>

<p>Notes:</p>
<ul>
  <li>(alias) means that the old KDE mime type is an alias in the corresponding XDG mime type, so the conversion is not strictly needed (although suggested)</li>
</ul>

<table border="1" summary="Table of KDE vs. XDG mime types">
<tr>
  <th>Old KDE mime type</th>
  <th>XDG mime type</th>
</tr>
<tr>
  <td>application/chm</td>
  <td>application/x-chm</td>
</tr>
<tr>
  <td>application/fits</td>
  <td>image/x-fits</td>
</tr>
<tr>
  <td>application/java</td>
  <td>application/x-java</td>
</tr>
<tr>
  <td>application/mathml+xml</td>
  <td>text/mathml</td>
</tr>
<tr>
  <td>application/msexcel</td>
  <td>application/vnd.ms-excel (alias)</td>
</tr>
<tr>
  <td>application/mspowerpoint</td>
  <td>application/vnd.ms-powerpoint (alias)</td>
</tr>
<tr>
  <td>application/ms-tnef</td>
  <td>application/vnd.ms-tnef</td>
</tr>
<tr>
  <td>application/pgp</td>
  <td>application/pgp-encrypted (alias)</td>
</tr>
<tr>
  <td>application/vnd.ms-asf</td>
  <td>video/x-ms-asf</td>
</tr>
<tr>
  <td>application/vnd.ms-word</td>
  <td>application/msword (alias)</td>
</tr>
<tr>
  <td>application/vnd.palm</td>
  <td>application/x-palm-database (alias)</td>
</tr>
<tr>
  <td>application/vnd.stardivision.writer-global</td>
  <td>application/vnd.stardivision.writer</td>
</tr>
<tr>
  <td>application/vnd.sun.xml.base</td>
  <td>application/vnd.oasis.opendocument.database</td>
</tr>
<tr>
  <td>application/vnd.sun.xml.writer.master</td>
  <td>application/vnd.sun.xml.writer.global</td>
</tr>
<tr>
  <td>application/wordperfect</td>
  <td>application/vnd.wordperfect (alias)</td>
</tr>
<tr>
  <td>application/x-7z</td>
  <td>application/x-7z-compressed</td>
</tr>
<tr>
  <td>application/x-afm</td>
  <td>application/x-font-afm</td>
</tr>
<tr>
  <td>application/x-applixgraphics</td>
  <td>image/x-applix-graphics</td>
</tr>
<tr>
  <td>application/x-applixspread</td>
  <td>application/x-applix-spreadsheet</td>
</tr>
<tr>
  <td>application/x-applixword</td>
  <td>application/x-applix-word</td>
</tr>
<tr>
  <td>application/x-bz2dvi</td>
  <td>application/x-bzdvi</td>
</tr>
<tr>
  <td>application/x-bzip2</td>
  <td>application/x-bzip (alias)</td>
</tr>
<tr>
  <td>application/x-dbase</td>
  <td>application/x-dbf (alias)</td>
</tr>
<tr>
  <td>application/x-font-ghostscript</td>
  <td>application/x-font-type1</td>
</tr>
<tr>
  <td>application/x-font-ttc</td>
  <td>application/x-font-ttf</td>
</tr>
<tr>
  <td>application/x-gettext</td>
  <td>text/x-gettext-translation (*.po)<br>
      text/x-gettext-translation-template (*.pot)</td>
</tr>
<tr>
  <td>application/x-hancomword</td>
  <td>application/x-hwp</td>
</tr>
<tr>
  <td>application/x-iso</td>
  <td>application/x-cd-image</td>
</tr>
<tr>
  <td>application/x-jar</td>
  <td>application/x-java-archive (alias)</td>
</tr>
<tr>
  <td>application/x-javascript</td>
  <td>application/javascript (alias)</td>
</tr>
<tr>
  <td>application/x-msaccess</td>
  <td>application/vnd.ms-access (alias)</td>
</tr>
<tr>
  <td>application/x-msdos-program</td>
  <td>application/x-ms-dos-executable</td>
</tr>
<tr>
  <td>application/x-msmetafile</td>
  <td>image/x-wmf</td>
</tr>
<tr>
  <td>application/x-ogg</td>
  <td>application/ogg</td>
</tr>
<tr>
  <td>application/x-perl-module</td>
  <td>application/x-perl</td>
</tr>
<tr>
  <td>application/x-python</td>
  <td>text/x-python</td>
</tr>
<tr>
  <td>application/x-rar-compressed</td>
  <td>application/x-rar</td>
</tr>
<tr>
  <td>application/x-tbz</td>
  <td>application/x-bzip-compressed-tar</td>
</tr>
<tr>
  <td>application/x-tgz</td>
  <td>application/x-compressed-tar</td>
</tr>
<tr>
  <td>application/x-troff</td>
  <td>text/troff (alias)</td>
</tr>
<tr>
  <td>application/x-zip</td>
  <td>application/zip</td>
</tr>
<tr>
  <td>application/x-zip-compressed</td>
  <td>application/zip (alias)</td>
</tr>
<tr>
  <td>application/xml-dtd</td>
  <td>text/x-dtd</td>
</tr>
<tr>
  <td>audio/mpegurl</td>
  <td>audio/x-mpegurl (alias)</td>
</tr>
<tr>
  <td>audio/x-midi</td>
  <td>audio/midi (alias)</td>
</tr>
<tr>
  <td>audio/x-mp3</td>
  <td>audio/mpeg (alias)</td>
</tr>
<tr>
  <td>audio/x-oggflac</td>
  <td>audio/x-flac+ogg</td>
</tr>
<tr>
  <td>audio/x-pn-realaudio</td>
  <td>audio/vnd.rn-realaudio (alias)</td>
</tr>
<tr>
  <td>audio/x-speex</td>
  <td>audio/x-speex+ogg</td>
</tr>
<tr>
  <td>audio/x-vorbis</td>
  <td>audio/x-vorbis+ogg</td>
</tr>
<tr>
  <td>audio/vorbis</td>
  <td>audio/x-vorbis+ogg</td>
</tr>
<tr>
  <td>image/fits</td>
  <td>image/x-fits</td>
</tr>
<tr>
  <td>image/jp2</td>
  <td>image/jpeg2000</td>
</tr>
<tr>
  <td>image/jpg</td>
  <td>image/jpeg</td>
</tr>
<tr>
  <td>image/pjpeg</td>
  <td>image/jpeg (alias)</td>
</tr>
<tr>
  <td>image/svg-xml</td>
  <td>image/svg+xml</td>
</tr>
<tr>
  <td>image/svg+xml</td>
  <td>image/svg+xml (*.svg)<br>
      image/svg+xml-compressed (*.svgz)</td>
</tr>
<tr>
  <td>image/x-bmp</td>
  <td>image/bmp</td>
</tr>
<tr>
  <td>image/x-djvu</td>
  <td>image/vnd.djvu (alias)</td>
</tr>
<tr>
  <td>image/x-portable-greymap</td>
  <td>image/x-portable-graymap</td>
</tr>
<tr>
  <td>image/x-raw</td>
  <td>image/x-dcraw (general mime type)<br><br>
      Specific mime types (all subclasses of image/x-dcraw):<br>
      image/x-panasonic-raw (*.raw)<br>
      image/x-panasonic-raw2 (*.rw2)<br>
      image/x-kodak-dcr (*.dcr)<br>
      image/x-adobe-dng (*.dng)<br>
      image/x-canon-crw (*.crw *.cr2)<br>
      image/x-nikon-nef (*.nef)<br>
      image/x-minolta-mrw (*.mrw)<br>
      image/x-kodak-k25 (*.k25)<br>
      image/x-kodak-kdc (*.kdc)<br>
      image/x-olympus-orf (*.orf)<br>
      image/x-pentax-pef (*.pef)<br>
      image/x-fuji-raf (*.raf)<br>
      image/x-sony-sr2 (*.sr2)<br>
      image/x-sony-srf (*.srf)<br>
      image/x-sigma-x3f (*.x3f)<br>
      other extensions that were part of image/x-raw: image/x-kde-raw
  </td>
</tr>
<tr>
  <td>image/x-targa</td>
  <td>image/x-tga</td>
</tr>
<tr>
  <td>image/x-vnd.adobe.photoshop</td>
  <td>image/x-psd</td>
</tr>
<tr>
  <td>image/x-xbm</td>
  <td>image/x-xbitmap</td>
</tr>
<tr>
  <td>image/x-xcf-gimp</td>
  <td>image/x-xcf</td>
</tr>
<tr>
  <td>image/x-xpm</td>
  <td>image/x-xpixmap</td>
</tr>
<tr>
  <td>text/docbook</td>
  <td>application/docbook+xml</td>
</tr>
<tr>
  <td>text/javascript</td>
  <td>application/javascript (alias)</td>
</tr>
<tr>
  <td>text/rss</td>
  <td>application/rss+xml (alias)</td>
</tr>
<tr>
  <td>text/rtf</td>
  <td>application/rtf</td>
</tr>
<tr>
  <td>text/x-csv</td>
  <td>text/csv</td>
</tr>
<tr>
  <td>text/x-diff</td>
  <td>text/x-patch</td>
</tr>
<tr>
  <td>text/mrml</td>
  <td>text/x-mrml</td>
</tr>
<tr>
  <td>text/x-latex</td>
  <td>text/x-tex</td>
</tr>
<tr>
  <td>text/xml</td>
  <td>application/xml (alias)</td>
</tr>
<tr>
  <td>text/x-mswinurl</td>
  <td>application/x-mswinurl</td>
</tr>
<tr>
  <td>text/x-vcalendar</td>
  <td>text/calendar (alias)</td>
</tr>
<tr>
  <td>text/x-vcard</td>
  <td>text/directory (alias)</td>
</tr>
<tr>
  <td>text/x-xslt</td>
  <td>application/xslt+xml</td>
</tr>
<tr>
  <td>video/avi</td>
  <td>video/x-msvideo</td>
</tr>
<tr>
  <td>video/x-ogm</td>
  <td>video/x-ogm+ogg</td>
</tr>
<tr>
  <td>video/x-theora</td>
  <td>video/x-theora+ogg</td>
</tr>
</table>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

<h3><a name="knewstuff">Changes in KNewStuff</a></h3>

<h4>General</h4>
KNewStuff is replaced with KNewStuff2. The API for applications has changed
completely, as the library is a rewrite and not an update.
Do not inherit from any class, use only KNS::Engine.
All application-specific properties especially about what to do with
downloaded files are configured in *.knsrc files; have a look at
knewstuff/doc/porting.txt and knewstuff/doc/tutorial.txt.

<h4>Upload</h4>
<ul>
<li>use <pre>KNS::Entry *entry = KNS::Engine::uploadDialogModal()</pre></li>
<li>do something with entry, if needed</li>
</ul>

<h4>Download</h4>
<ul>
<li>use <pre>KNS::Entry::List entries = KNS::Engine::downloadDialogModal()</pre></li>
<li>do something with the entries, if needed</li>
</ul>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>


<h3><a name="dcop">DCOP</a></h3>

DCOP has been replaced with D-Bus.<br />
Help with porting from DCOP to D-Bus can be found at
<a href="http://techbase.kde.org/Development/Tutorials/Porting_to_D-Bus">http://techbase.kde.org/Development/Tutorials/Porting_to_D-Bus</a>

<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>


<h3><a name="printing">Printing</a></h3>

<p>libkdeprint has been replaced by enhanced printing support in Qt 4.  Qt 4.3
is still lacking in a print preview feature and a customisable print dialog.
KPrintPreview (kutils) provides the former, and KdePrint::createPrintDialog()
(kdeui) provides the latter, at least for Qt 4.3.2 onwards.</p>

<h4>Porting involves the following</h4>
<ul>
<li>using QPrinter instead of KPrinter</li>
<li>using KdePrint::createPrintDialog() (in kdeui) to get a (customised) QPrintDialog, rather than using KPrinter::setup()</li>
<li>using KPrintPreview (in kutils) for print preview, rather than KPrinter::setPreviewOnly(true)</li>
<li>removing the dependency on libkdeprint</li>
</ul>

<p>If the code uses addDialogPage, you need to change the KPrintDialogPage to a
QWidget, and you can get rid of the getOptions and setOptions methods in favor
of a method for each option (since QPrintDialog doesn't do anything with the widget
except display it). Then the code that called KPrinter::addDialogPage and
KPrinter::setup needs to use KdePrint::createPrintDialog instead and get the options
directly from the widgets passed to createPrintDialog rather than from the QPrinter.
The widgets should also use setWindowTitle() rather than setTitle().</p>

<h4>For more details, see the following:</h4>
<ul>
<li><a href="http://doc.trolltech.com/4.3/printing.html">Printing with Qt</a></li>
<li><a href="http://api.kde.org/4.x-api/kdelibs-apidocs/kutils/html/classKPrintPreview.html">KPrintPreview apidocs</a></li>
<li><a href="http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/namespaceKdePrint.html">KdePrint::createPrintDialog apidocs</a></li>
<li><a href="http://techbase.kde.org/Projects/KDEPrint/KDE4#Porting">KDEPrint Porting on TechBase</a></li>
</ul>


<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>

</body>
</html>