Difference between revisions of "Development/Tutorials/Programming Tutorial KDE 4/KDirWatch"
Neverendingo (talk | contribs) m (Text replace - "</code>" to "</syntaxhighlight>") |
|||
(29 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== | |
− | + | If you want your program to be notified upon file changes, use {{class|KDirWatch}}. Here is an example. | |
− | |||
− | |||
− | |||
− | + | ===khello.h=== | |
− | # | + | <syntaxhighlight lang="cpp-qt"> |
+ | #ifndef _KHELLO_H_ | ||
+ | #define _KHELLO_H_ | ||
− | class | + | #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 | + | #endif // _KHELLO_H_ |
− | </ | + | </syntaxhighlight> |
− | + | This subclasses {{class|KMainWindow}}. | |
− | + | ===khello.cpp=== | |
+ | <syntaxhighlight lang="cpp-qt"> | ||
+ | #include "khello.h" | ||
− | + | #include <qlabel.h> | |
− | + | #include <kdebug.h> | |
− | < | + | #include <kmainwindow.h> |
− | #include | + | #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" | |
+ | </syntaxhighlight> | ||
+ | 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. | ||
− | |||
− | |||
===main.cpp=== | ===main.cpp=== | ||
− | < | + | <syntaxhighlight lang="cpp-qt"> |
− | #include < | + | /* |
− | #include < | + | This program is a demo how to react on file changes. |
− | #include < | + | */ |
+ | |||
+ | #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 | + | int main(int argc, char **argv) |
{ | { | ||
− | + | KAboutData about("khello", I18N_NOOP("khello"), version, | |
− | + | description, KAboutData::License_GPL, | |
− | 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(); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
− | |||
==CMake== | ==CMake== | ||
− | The best way to build the program is to use CMake | + | The best way to build the program is to use CMake. |
===CMakeLists.txt=== | ===CMakeLists.txt=== | ||
− | < | + | <syntaxhighlight lang="ini"> |
− | project ( | + | project (dirwatch) |
− | find_package(KDE4 REQUIRED) | + | find_package(KDE4 REQUIRED KIO KDIRWATCH) |
include_directories( ${KDE4_INCLUDES} ) | include_directories( ${KDE4_INCLUDES} ) | ||
− | set( | + | set(dirwatch_SRCS |
− | + | main.cpp | |
− | + | khello.cpp | |
) | ) | ||
− | kde4_add_executable( | + | kde4_add_executable(dirwatch ${dirwatch_SRCS}) |
− | target_link_libraries( | + | target_link_libraries( dirwatch ${KDE4_KDEUI_LIBS} |
− | </ | + | ${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. | ||
− | === | + | ===Compile it=== |
To compile, link and run it, use: | To compile, link and run it, use: | ||
− | cmake . && make && ./ | + | cmake . && make && ./dirwatch /var/log/messages |
− | + | If {{path|/var/log/messages}} changes, the program will notify you about it. | |
− | |||
− | |||
[[Category:C++]] | [[Category:C++]] |
Latest revision as of 20:54, 29 June 2011
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.