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

    From KDE TechBase
    Line 211: Line 211:
    <code ini>
    <code ini>
    project (tutorial2)
    project (tutorial2)
    find_package(KDE4 REQUIRED)
    find_package(KDE4 REQUIRED KIO KDIRWATCH)
    include_directories( ${KDE4_INCLUDES} )
    include_directories( ${KDE4_INCLUDES} )
    set(tutorial2_SRCS  
    set(tutorial2_SRCS
    main.cpp
            main.cpp
    mainwindow.cpp
            khello.cpp
    )
    )
    KDE4_AUTOMOC( ${tutorial2_SRCS} )
    kde4_add_executable(tutorial2 ${tutorial2_SRCS})
    kde4_add_executable(tutorial2 ${tutorial2_SRCS})
    target_link_libraries( tutorial2 ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} )
    target_link_libraries( tutorial2 ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS})
    </code>
    </code>



    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
    

    Moving On

    Now you can move on to using KActions.