Development/Tutorials/Programming Tutorial KDE 4/KDirWatch: Difference between revisions

From KDE TechBase
m (Text replace - "</code>" to "</syntaxhighlight>")
 
(26 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Warning|If this is going to be made into a proper tutorial, it should be on the ''main tutorial page''. '''Not''' a part of this small tutorial series.}}
==Using KDirWatch==
==Using KDirWatch==


If you want your program to be notified upon file changes, use KDirWatch. Here is an example.
If you want your program to be notified upon file changes, use {{class|KDirWatch}}. Here is an example.


===khello.h===
===khello.h===
<code cppqt>
<syntaxhighlight lang="cpp-qt">
/***************************************************************************
*  Copyright (C) 2004 by Thorsten Staerk
*  kde at staerk de
*  This program is free software; you can redistribute it and/or modify  *
*  it under the terms of the GNU General Public License as published by  *
*  the Free Software Foundation; either version 2 of the License, or    *
*  (at your option) any later version.
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*  You should have received a copy of the GNU General Public License    *
*  along with this program; if not, write to the
*  Free Software Foundation, Inc.,
*  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
******************************************************************
 
*/
 
 
#ifndef _KHELLO_H_
#ifndef _KHELLO_H_
#define _KHELLO_H_
#define _KHELLO_H_
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif


#include <kmainwindow.h>
#include <kmainwindow.h>
Line 37: Line 15:
/**
/**
  * @short Application Main Window
  * @short Application Main Window
  * @author Thorsten Staerk <thorsten@staerk.de>
  * @author Thorsten Staerk <someone@home.de>
  * @version 0.1
  * @version 0.1
  */
  */
Line 49: Line 27:
     */
     */
     khello(char* args);
     khello(char* args);
    /**
    * Default Destructor
    */
    virtual ~khello();


public slots:
public slots:
Line 61: Line 34:


#endif // _KHELLO_H_
#endif // _KHELLO_H_
</code>
</syntaxhighlight>
First we Subclass KXmlGuiWindow on line 7 with with <tt>class MainWindow : public KXmlGuiWindow</tt>.
This subclasses {{class|KMainWindow}}.
 
Then we declare the constructor with <tt>MainWindow(QWidget *parent=0);</tt>.
 
And finally we declare a pointer to the object that will make up the bulk of our program. {{class|KTextEdit}} is a generic richtext editor with some KDE niceties like cursor auto-hiding.


===khello.cpp===
===khello.cpp===
<code cppqt>
<syntaxhighlight lang="cpp-qt">
/***************************************************************************
*  Copyright (C) 2004-2006 by Thorsten Staerk                              kde at staerk de
*  This program is free software; you can redistribute it and/or modify  *
*  it under the terms of the GNU General Public License as published by  *
*  the Free Software Foundation; either version 2 of the License, or    *
*  (at your option) any later version.
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*  You should have received a copy of the GNU General Public License    *
*  along with this program; if not, write to the
*  Free Software Foundation, Inc.,
*  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*******************************************
 
This program shows us how to set up a kdirwatch, telling us when a file has changed.
This program is a bundle of files and was created with kdevelop.
*/
 
/*
Working time on this program
2005-01-01 5 h
        first tried without the macro Q_OBJECT, this fails (see www.trolltech.com)
2006-12-27 1 h
      enabled arguments
*/
 
#include "khello.h"
#include "khello.h"


Line 115: Line 56:
     connect(&dw, SIGNAL(dirty(const QString & ) ),
     connect(&dw, SIGNAL(dirty(const QString & ) ),
           SLOT( slotdirty() ) );
           SLOT( slotdirty() ) );
}
khello::~khello()
{
}
}


Line 127: Line 64:


#include "khello.moc"
#include "khello.moc"
</code>
</syntaxhighlight>
First, of course, on line 1 we have to include the header file containing the class declaration.
When instanciated, the class creates a KDirWatcher object and tells it to watch the file passed in by the arguments (<syntaxhighlight lang="text">dw.addFile(args)</syntaxhighlight>). The DirWatcher will now emit a SIGNAL dirty each time this file gets modified. This signal is connected to khello's slot ''slotdirty()''. So, every time the file gets modified, slotdirty is called.


On line 5, we initialise our text editor with an object. Then on line 6 we use the built-in setCentralWidget() function which tells the KXmlGuiWindow what should appear in the central section of the window.
===main.cpp===
<syntaxhighlight lang="cpp-qt">
/*
This program is a demo how to react on file changes.
*/


Finally, KXmlGuiWindow::setupGUI() is called which does a lot of behind-the-scenes stuff and creates the default menu bars (Settings, Help).
#include "khello.h"
#include <kapplication.h>
#include <kaboutdata.h>
#include <kcmdlineargs.h>
#include <kdebug.h>
#include <klocale.h>


==Back to main.cpp==
static const char description[] =
In order to actually run this window, we need to add a few lines in main.cpp:
    I18N_NOOP("An ");
===main.cpp===
<code cppqt>
#include <KApplication>
#include <KAboutData>
#include <KCmdLineArgs>


#include "mainwindow.h"
static const char version[] = "0.1";


int main (int argc, char *argv[])
static KCmdLineOptions options[] =
{
{
  KAboutData aboutData( "tutorial2",  
    { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
      "Tutorial2", "1.0", "A simple text area",
    KCmdLineLastOption
      KAboutData::License_GPL, "(c) 2006" );
};
  KCmdLineArgs::init( argc, argv, &aboutData );
 
  KApplication app;
  MainWindow* window = new MainWindow();
  window->show();


  return app.exec();
int main(int argc, char **argv)
{
    KAboutData about("khello", I18N_NOOP("khello"), version,
      description, KAboutData::License_GPL,
      "(C) %{YEAR} Thorsten Staerk", 0, 0, "[email protected]");
    about.addAuthor( "Thorsten Staerk", 0, "[email protected]" );
    KCmdLineArgs::init(argc, argv, &about);
    KCmdLineArgs::addCmdLineOptions( options );
    KApplication app;
 
    KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
    kdDebug() << argv[1] << endl;
    khello *mainWin = new khello(argv[1]);
    mainWin->show();
 
    return app.exec();
}
}
</code>
</syntaxhighlight>
The only new lines here (compared to Tutorial 1) are 16 and 17. On line 16, we create our MainWindow object and then on line 17, we display it.


==CMake==
==CMake==
The best way to build the program is to use CMake. All that's changed since tutorial 1 is that <tt>mainwindow.cpp</tt> has been added to the sources list and any <tt>tutorial1</tt> has become <tt>tutorial2</tt>.
The best way to build the program is to use CMake.
===CMakeLists.txt===
===CMakeLists.txt===
<code ini>
<syntaxhighlight lang="ini">
project (tutorial2)
project (dirwatch)
find_package(KDE4 REQUIRED)
find_package(KDE4 REQUIRED KIO KDIRWATCH)
include_directories( ${KDE4_INCLUDES} )
include_directories( ${KDE4_INCLUDES} )
set(tutorial2_SRCS
set(dirwatch_SRCS
main.cpp
        main.cpp
mainwindow.cpp
        khello.cpp
)
)
kde4_add_executable(tutorial2 ${tutorial2_SRCS})
kde4_add_executable(dirwatch ${dirwatch_SRCS})
target_link_libraries( tutorial2 ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} )
target_link_libraries( dirwatch ${KDE4_KDEUI_LIBS}  
</code>
  ${KDE4_KIO_LIBS} )
</syntaxhighlight>
Note that we added ''${KDE4_KIO_LIBS}'' to the ''target_link_libraries''. If we do not do it, the linker complains about undefined symbols. In the kio-libs, KDirWatch is defined.


===Kompile it===
===Compile it===
To compile, link and run it, use:
To compile, link and run it, use:
  cmake . && make && ./tutorial2
  cmake . && make && ./dirwatch /var/log/messages
 
If {{path|/var/log/messages}} changes, the program will notify you about it.
==Moving On==
Now you can move on to [[Development/Tutorials/Programming_Tutorial_KDE_4/Using_KActions|using KActions]].


[[Category:C++]]
[[Category:C++]]

Latest revision as of 20:54, 29 June 2011

Warning
If this is going to be made into a proper tutorial, it should be on the main tutorial page. Not a part of this small tutorial series.


Using KDirWatch

If you want your program to be notified upon file changes, use KDirWatch. Here is an example.

khello.h

#ifndef _KHELLO_H_
#define _KHELLO_H_

#include <kmainwindow.h>
#include <kdirwatch.h>

/**
 * @short Application Main Window
 * @author Thorsten Staerk <[email protected]>
 * @version 0.1
 */
class khello : public KMainWindow
{
    Q_OBJECT
public:
    KDirWatch dw;
    /**
     * Default Constructor
     */
    khello(char* args);

public slots:
    void slotdirty();

};

#endif // _KHELLO_H_

This subclasses KMainWindow.

khello.cpp

#include "khello.h"

#include <qlabel.h>

#include <kdebug.h>
#include <kmainwindow.h>
#include <klocale.h>
#include <kmessagebox.h>

khello::khello(char* args)
    : KMainWindow()
{
    kdDebug() << "args = " << args << endl;
    dw.addFile(args);
    kdDebug() << "Watching file " << args << endl;
    connect(&dw, SIGNAL(dirty(const QString & ) ),
           SLOT( slotdirty() ) );
}

void khello::slotdirty()
{
  kdDebug() << "File has changed" << endl;
}

#include "khello.moc"

When instanciated, the class creates a KDirWatcher object and tells it to watch the file passed in by the arguments (

dw.addFile(args)

). The DirWatcher will now emit a SIGNAL dirty each time this file gets modified. This signal is connected to khello's slot slotdirty(). So, every time the file gets modified, slotdirty is called.

main.cpp

/*
This program is a demo how to react on file changes.
*/

#include "khello.h"
#include <kapplication.h>
#include <kaboutdata.h>
#include <kcmdlineargs.h>
#include <kdebug.h>
#include <klocale.h>

static const char description[] =
    I18N_NOOP("An ");

static const char version[] = "0.1";

static KCmdLineOptions options[] =
{
    { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
    KCmdLineLastOption
};

int main(int argc, char **argv)
{
    KAboutData about("khello", I18N_NOOP("khello"), version, 
      description, KAboutData::License_GPL, 
      "(C) %{YEAR} Thorsten Staerk", 0, 0, "[email protected]");
    about.addAuthor( "Thorsten Staerk", 0, "[email protected]" );
    KCmdLineArgs::init(argc, argv, &about);
    KCmdLineArgs::addCmdLineOptions( options );
    KApplication app;

    KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
    kdDebug() << argv[1] << endl;
    khello *mainWin = new khello(argv[1]);
    mainWin->show();

    return app.exec();
}

CMake

The best way to build the program is to use CMake.

CMakeLists.txt

project (dirwatch)
find_package(KDE4 REQUIRED KIO KDIRWATCH)
include_directories( ${KDE4_INCLUDES} )
set(dirwatch_SRCS
        main.cpp
        khello.cpp
)
kde4_add_executable(dirwatch ${dirwatch_SRCS})
target_link_libraries( dirwatch ${KDE4_KDEUI_LIBS} 
  ${KDE4_KIO_LIBS} )

Note that we added ${KDE4_KIO_LIBS} to the target_link_libraries. If we do not do it, the linker complains about undefined symbols. In the kio-libs, KDirWatch is defined.

Compile it

To compile, link and run it, use:

cmake . && make && ./dirwatch /var/log/messages

If /var/log/messages changes, the program will notify you about it.