Шаг 95.
Библиотека Qt.
Класс QFileSystemWatcher

    На этом шаге рассмотрим класс QFileSystemWatcher.

    Такой механизм реализует класс QFileSystemWatcher. Его применение сводится к тому, что следует добавить методом addPath() нужный вам путь к файлу либо к каталогу, а когда необходимость в наблюдении за ним отпадет, удалить при помощи метода removePath(). При изменениях файла отправляется сигнал fileChanged(), а если изменен каталог — сигнал directoryChanged(). Оба сигнала передают в качестве параметра путь, по которому произошли изменения. Уведомления о изменениях осуществляются асинхронно и не блокируют выполнение основного потока. Для иллюстрации вышесказанного реализуем программу, которая будет принимать в командной строке каталоги и файлы и отображать их при изменениях (рис. 1).


Рис.1. Наблюдение за изменением файлов и каталогов

    В заголовочном файле этого приложения описан класс Watcher:

//унаследуем QTextEdit 
class Watcher : public QTextEdit {
Q_OBJECT
public:
    Watcher(QWidget* pwgt = 0);
//слоты для отображения пути измененного каталога slotDirectoryCh()
//и пути и имени измененного файла slotFileCh()
private slots:
    void slotDirectoryCh(const QString&);
    void slotFileCh     (const QString&);
};

    Рассмотрим реализацию конструктора и слотов:

//присваиваем надпись для основного окна приложения
Watcher::Watcher(QWidget* pwgt /*=0*/) : QTextEdit(pwgt)
{
    setWindowTitle("Наблюдатель");
}
//выполняем отображение информации при вызовах слотов 
void Watcher::slotDirectoryCh(const QString& str)
{
    append("Каталог изменен:" + str);
}
void Watcher::slotFileCh(const QString& str)
{
    append("Файл изменен:" + str);
} 

    приведем текст файла main.cpp

int main(int argc, char** argv)
{
    QApplication       app(argc, argv);
    //создаем объекты наблюдателя (watch) и 
    QFileSystemWatcher watch;
    //виджета для отображения информации (view)
    Watcher view;
    //из объекта приложения (app) запрашиваем список параметров,
    //переданных пользователем в командной строке (метод arguments())
    QStringList args = app.arguments();
    //убираем самый первый элемент списка,
    //т. к. он является именем нашей программы
    args.removeFirst();
    //полученный список передаем объекту наблюдателю
    //и для этого вызываем метод QFileSystemWatcher::addPaths().
    //Объект наблюдателя автоматически анализирует и распознает,
    //что из списка является каталогом, а что файлом
    watch.addPaths(args);
    //для того чтобы увидеть результат этого анализа,
    //отдельно отобразим файлы (метод QFileSystemWatcher::files())
    //и каталоги (метод QFileSystemWatcher:: directories())
    view.append("Наблюдаемый файл:" + watch.files().join(";"));
    view.append("Наблюдаемый каталог:" + watch.directories().join(";"));
    view.show();
    //связываем сигналы объекта наблюдателя QFileSystemWatcher::directoryChanged()
    //и QFileSystemWatcher::fileChanged() со слотами slotDirectoryCh() 
    //и slotFileCh() виджета отображения
    QObject::connect(&watch, SIGNAL(directoryChanged(const QString&)),
                     &view, SLOT(slotDirectoryCh(const QString&)));
    QObject::connect(&watch, SIGNAL(fileChanged(const QString&)),
                     &view, SLOT(slotFileCh(const QString&)));
    return app.exec();
}

    Файлы приложения можно взять здесь.

    На следующем шаге рассмотрим потоки ввода-вывода.




Предыдущий шаг Содержание Следующий шаг