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

From KDE TechBase
Line 224: Line 224:
===Kompile it===
===Kompile it===
To compile, link and run it, use:
To compile, link and run it, use:
  cmake . && make && ./tutorial2
  cmake . && make && ./tutorial2 /var/log/messages


==Moving On==
==Moving On==

Revision as of 22:24, 18 June 2007

Using KDirWatch

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

khello.h

/***************************************************************************

*   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.
******************************************************************
  • /


  1. ifndef _KHELLO_H_
  2. define _KHELLO_H_
  1. ifdef HAVE_CONFIG_H
  2. include <config.h>
  3. endif
  1. include <kmainwindow.h>
  2. 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);
   /**
    * Default Destructor
    */
   virtual ~khello();

public slots:

   void slotdirty();

};

  1. endif // _KHELLO_H_

First we Subclass KXmlGuiWindow on line 7 with with class MainWindow : public KXmlGuiWindow.

Then we declare the constructor with MainWindow(QWidget *parent=0);.

And finally we declare a pointer to the object that will make up the bulk of our program. KTextEdit is a generic richtext editor with some KDE niceties like cursor auto-hiding.

khello.cpp

/***************************************************************************

*   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
*/
  1. include "khello.h"
  1. include <qlabel.h>
  1. include <kdebug.h>
  2. include <kmainwindow.h>
  3. include <klocale.h>
  4. 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() ) );

}

khello::~khello() { }

void khello::slotdirty() {

 kdDebug() << "File has changed" << endl;

}

  1. include "khello.moc"

First, of course, on line 1 we have to include the header file containing the class declaration.

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.

Finally, KXmlGuiWindow::setupGUI() is called which does a lot of behind-the-scenes stuff and creates the default menu bars (Settings, Help).

Back to main.cpp

In order to actually run this window, we need to add a few lines in main.cpp:

main.cpp

/***************************************************************************

*   Copyright (C) 2004 by Thorsten Staerk
*   thorsten 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 reacts on file changes.

  • /


  1. include "khello.h"
  2. include <kapplication.h>
  3. include <kaboutdata.h>
  4. include <kcmdlineargs.h>
  5. include <kdebug.h>
  6. include <klocale.h>

static const char description[] =

   I18N_NOOP("A KDE KPart Application");

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;
   khello *mainWin = 0;
   {
       // no session.. just start up normally
       KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
       /// @todo do something with the command line args here
       kdDebug() << argv[1] << endl;
       mainWin = new khello(argv[1]);
       mainWin->show();
       args->clear();
   }
   // mainWin has WDestructiveClose flag by default, so it will delete itself.
   return app.exec();

}

CMake

The best way to build the program is to use CMake. All that's changed since tutorial 1 is that mainwindow.cpp has been added to the sources list and any tutorial1 has become tutorial2.

CMakeLists.txt

project (tutorial2) find_package(KDE4 REQUIRED KIO KDIRWATCH) include_directories( ${KDE4_INCLUDES} ) set(tutorial2_SRCS

       main.cpp
       khello.cpp

) KDE4_AUTOMOC( ${tutorial2_SRCS} ) kde4_add_executable(tutorial2 ${tutorial2_SRCS}) target_link_libraries( tutorial2 ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS})

Kompile it

To compile, link and run it, use:

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

Moving On

Now you can move on to using KActions.