PDA

View Full Version : How to make a “loading…” window appear only once when a specific file is found infin



Sai Kamat
14th March 2014, 07:11
I want to display a "generating image..." kind of modal dialog, other than the main GUI. This "generating image..." dialog should be temporary, and be displayed and disappear without user intervention. For displaying this dialog, the Qt code should check for existence of a usbResponse.txt file in a specific location in the PC's hard disk. If the usbResponse.txt file exists, then the dialog should pop-up. I am able to display this loading GIF.
I am able to close the GIF whenever that txt file i.e. usbResponse.txt is modified, using FileSystemWatcher.

The issue is when I'm scanning for the existence of the .txt using threads. When I find the file I display the loading GIF. But due to it's continuous nature, the GIF windows are displayed multiple times. I want this to happen only once, when it's found. Would something like 'break' work? I find it unlikely. How to do this?Please advise. Here is my code:

mainwindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFile>
#include <QDebug>
#include <QFileSystemWatcher>
#include "dialog.h"
#include "mythread.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();


public slots:
void afterFileHasBeenFound();
void closeModified(const QString &str);

private slots:

private:
Ui::MainWindow *ui;
Dialog *pDialog;
MyThread *mThread;
};

#endif // MAINWINDOW_H


mythread.h


#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <QtCore>
#include <QDebug>

#define FILE_PATH "E:\\QT1\\dialogClose2\\dialogClose2\\usbResponse.t xt"

class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
void run();
QString name;
int exec();
void checkFile();

signals:
void testSignal(QString message);
void fileFoundDisplayGif();

public slots:

};

#endif // MYTHREAD_H


dialog.h


#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QMovie>
#include <QLabel>

#define GIF_PATH "E:\\QT1\\timeStampPopUp\\timeStampPopUp\\loading.g if"
namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
Q_OBJECT

public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
void displayLoadingGif();

private:
Ui::Dialog *ui;
};

#endif // DIALOG_H


dialog.cpp


#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
displayLoadingGif();
}

Dialog::~Dialog()
{
delete ui;
}

void Dialog::displayLoadingGif()
{
QMovie *pMovie = new QMovie(GIF_PATH);
ui->loadingGifLabel->setMovie(pMovie);
pMovie->start();
}


mythread.cpp


#include "mythread.h"

MyThread::MyThread(QObject *parent) :
QThread(parent)
{
}

void MyThread::run()
{
exec();
}

int MyThread::exec()
{
while(1)
{
checkFile();
emit(testSignal("hello world!!"));
sleep(1);
}
}

void MyThread::checkFile()
{
QFile file(FILE_PATH);
if(file.exists())
{
qDebug()<<"exists";
emit(fileFoundDisplayGif());
}
else
qDebug()<<"doesn't exist";
}


mainwindow.cpp


#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
mThread = new MyThread(this);
mThread->name = "mThread";
connect(mThread, SIGNAL(fileFoundDisplayGif()), this, SLOT(afterFileHasBeenFound()), Qt::QueuedConnection);
mThread->start();
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::afterFileHasBeenFound()
{
pDialog = new Dialog();
pDialog->setModal(true);
pDialog->show();
}

void MainWindow::closeModified(const QString &str)
{
Q_UNUSED(str)
pDialog->hide();
QFile file(FILE_PATH);
file.remove();
}


main.cpp


#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFileSystemWatcher fileWatcher;
fileWatcher.addPath(FILE_PATH);
QStringList fileList = fileWatcher.files();
Q_FOREACH(QString file, fileList)
qDebug() << "File name " << file;
MainWindow* mc = new MainWindow;
QObject::connect(&fileWatcher, SIGNAL(fileChanged(QString)), mc, SLOT(closeModified(QString)));
mc->show();


return a.exec();
}

anda_skoa
14th March 2014, 08:53
Why do you let the thread continue if once you found the file?
Why do you use a thread at all?

Cheers,
_

Sai Kamat
14th March 2014, 10:55
Hi! The file will come anytime, I need to keep on scanning for this file. So once this file is found, i cannot stop, i have to delete this file and keep scanning until another such file comes. Hope this clarified your doubt.


Why do you let the thread continue if once you found the file?
Why do you use a thread at all?

Cheers,
_

anda_skoa
14th March 2014, 11:53
Any reason you don't use QFileSystemWatcher?

Cheers,
_

Sai Kamat
14th March 2014, 13:07
Yes, coz QFileSystemWatcher is very generic. I want it to monitor for the existence of a particular file only. QFileSystemWatcher will monitor the entire directory and emit signal for any modification in the directory. I do not desire this.