2014-11-06 5 views
1

Я реализовал объект QTimer, чтобы сигнализировать функцию, которая читается из .txt-файла каждую секунду и создает новый объект другого класса. Моя проблема в том, что я хочу ограничить мою функцию только созданием 1 объекта и продолжать проверять файл .txt на любые изменения. Как это можно сделать?Qt GUI - хотите читать из .txt-файла только при изменении значения

Ниже приведен код, который выполняется каждый второй

void PutMeDown::signalReceived() 
{ 

    char buffer; 
    char currentState; 
    char prevState = '0'; 

    int fd = open("/home/stud/test", O_RDWR, 0666); 

    if(fd < 0) 
     cout << "can't open file" << endl; 
    else 
     read(fd, &buffer, 1);//read from file 

    currentState = buffer; 

    if(currentState == prevState) 
    { 

     drive = new Drive(this); 
     drive->setWindowFlags(Qt::Window | Qt::FramelessWindowHint); 
     drive->show(); 
     this->hide(); 

    } 

    close(fd); 
} 

ответ

3

Существует специальный класс в Qt - QFileSystemWatcher. Этот класс может сказать вам, что файл был изменен (fileChanged сигнал).

QFileSystemWatcher * watcher = new QFileSystemWatcher(this); 
watcher->addPath(mFileName); 
connect(watcher,SIGNAL(fileChanged(QString)),SLOT(slot(QString))); 

В слоте вы можете прочитать файл или сделать что-то еще. С этим классом вам не нужно использовать QTimer, это может быть лучше, чем проверка файла каждую секунду.

Назад к вопросу по объекту 1. Самое простое решение - предоставить дополнительную переменную bool, проверить эту переменную в слоте и создать новый объект или нет. Вы также можете указать способ изменить эту переменную «снаружи», чтобы ваш объект был создан, когда вам это нужно.

Также я вижу, что вы используете подход non-Qt для чтения файла. В Qt есть специальный класс: QFile. Проверьте это, возможно, ваша задача позволяет использовать QFile.

+0

Если я что-то не понял, укажите, пожалуйста, в комментарии. – Chernobyl

+0

Спасибо за быстрый ответ, это было то, что мне просто нужно :-) – MichaelTJ

+0

@MichaelTJ Спасибо за ваш комментарий, я был немного смущен, потому что кто-то запустил мой ответ и отменил downvoting немедленно, вот почему я думал, что мой ответ не подходит (что-то неправильно понял), но теперь я вижу, что все в порядке. – Chernobyl