Russian Qt Forum

Qt => Общие вопросы => Тема начата: tornadodead от Март 02, 2012, 09:06



Название: [РЕШЕН] прогресс копирования
Отправлено: tornadodead от Март 02, 2012, 09:06
нужно организовать визуальный прогресс копирования
есть функция копирования
Код:
bool FileManager::copyFolder(QString sourceFolder, QString destFolder)
{
    QDir sourceDir(sourceFolder);
    if(!sourceDir.exists())
        return false;
    QDir destDir(destFolder);
    if(!destDir.exists())
    {
        destDir.mkdir(destFolder);
    }
    QStringList files = sourceDir.entryList(QDir::Files);
    for(int i = 0; i< files.count(); i++)
    {
        QString srcName = sourceFolder + "/" + files[i];
        QString destName = destFolder + "/" + files[i];
        QFile::copy(srcName, destName);
    }
    files.clear();
    files = sourceDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
    for(int i = 0; i< files.count(); i++)
    {
        QString srcName = sourceFolder + "/" + files[i];
        QString destName = destFolder + "/" + files[i];
        copyFolder(srcName, destName);
    }
}
есть диалоговое окно, в котором создается новый поток, и вызывается в нем этот метод
как в прогресс отображать ход копирования?
Думаю, нужно знать общее число файлов, и при копирование очередного файла обновлять прогреес.
Дело в том, что если файлов может быть много тогда, рекурсия подсчета займет прилично времени. И как-то функция копирования должна возвращать, что очередной файл был скопирован.  Что посоветуете думаю что, уже многие что-то подобное делали.


Название: Re: прогресс копирования
Отправлено: Пантер от Март 02, 2012, 09:26
Читай про сигналы/слоты.
Сначала считаешь количество файлов, потом, при копировании очередного файла, кидаешь об этом сигнал.


Название: Re: прогресс копирования
Отправлено: tornadodead от Март 02, 2012, 10:00
Читай про сигналы/слоты.
Сначала считаешь количество файлов, потом, при копировании очередного файла, кидаешь об этом сигнал.
т.е. в функции копирования, реализовать этот сигнал?


Название: Re: прогресс копирования
Отправлено: Пантер от Март 02, 2012, 10:02
Да. Как только файл скопировался, эмитишь сигнал об этом.


Название: Re: прогресс копирования
Отправлено: tornadodead от Март 02, 2012, 10:24
Да. Как только файл скопировался, эмитишь сигнал об этом.
в методе copyFolder я сделал emit сигнала, а теперь мне как все это дело получить в окне где прогрее идет, так-же в каждом классе емитить?


Название: Re: прогресс копирования
Отправлено: Пантер от Март 02, 2012, 10:34
Коннектишь сигнал на слот и в нем выставляешь нужный прогресс. В чем сложности?


Название: Re: прогресс копирования
Отправлено: tornadodead от Март 02, 2012, 10:39
Коннектишь сигнал на слот и в нем выставляешь нужный прогресс. В чем сложности?
в том что в классе где идет вызов копирования я не могу вызвать этот сигнал, или чет не до понимаю!!!
FileManager- класс который копирует, и содержит сигнал
connect("FileManager",SIGNAL) и нет этого сигнала=(


Название: Re: прогресс копирования
Отправлено: Пантер от Март 02, 2012, 10:46
Показывай код.


Название: Re: прогресс копирования
Отправлено: tornadodead от Март 02, 2012, 10:49
Показывай код.

вот у меня поток где вызываю копирование

Код:
void ThreadCopy::run(){
        FileManager f;
         f.copyFolder("","");
}
я так понимаю здесь и надо конектить сигнал который эмитится при копировании файла
connect(f,SIGNAL(copyDone()),...,....), так?


Название: Re: прогресс копирования
Отправлено: Пантер от Март 02, 2012, 10:54
connect (&f, SIGNAL (progress (int, int)), SLOT (progress (int, int))


Название: Re: прогресс копирования
Отправлено: tornadodead от Март 02, 2012, 11:01
connect (&f, SIGNAL (progress (int, int)), SLOT (progress (int, int))
да говорю вылетает ошибка
ошибка: no matching function for call to 'ThreadCopy::connect(FileManager*, const char [12], const char [15])'
connect(&f,SIGNAL(copyDone()),SLOT("какойто слот"));
а чтоб до прогреесбар добраться, нужно еще на один уровень выше, т.е. к диалоговому окну=)


Название: Re: прогресс копирования
Отправлено: mutineer от Март 02, 2012, 11:20
connect (&f, SIGNAL (progress (int, int)), SLOT (progress (int, int))
да говорю вылетает ошибка
ошибка: no matching function for call to 'ThreadCopy::connect(FileManager*, const char [12], const char [15])'
connect(&f,SIGNAL(copyDone()),SLOT("какойто слот"));
а чтоб до прогреесбар добраться, нужно еще на один уровень выше, т.е. к диалоговому окну=)

Ошибка, потому что твой ThreadCopy не отнаследован от QObject. вызывай QObject::connect, а не connect


Название: Re: прогресс копирования
Отправлено: tornadodead от Март 02, 2012, 11:46
Ошибка, потому что твой ThreadCopy не отнаследован от QObject. вызывай QObject::connect, а не connect
а вот и нет, не в этом дело


Название: Re: прогресс копирования
Отправлено: mutineer от Март 02, 2012, 11:50
Ошибка, потому что твой ThreadCopy не отнаследован от QObject. вызывай QObject::connect, а не connect
а вот и нет, не в этом дело

Ну или FileManager не отнаследован от QObject


Название: Re: прогресс копирования
Отправлено: tornadodead от Март 02, 2012, 12:21
ок, заработало, есть еще один ньюансик, я делаю emit copyDone();

и затем в классе
Код:
connect(&f,SIGNAL(copyDone()),SLOT(my_slot()));
т.е. получается когда сигнал с эмитится, должен вызваться этот коннект и запустится слот my_slot, так?


Название: Re: прогресс копирования
Отправлено: mutineer от Март 02, 2012, 12:23
ок, заработало, есть еще один ньюансик, я делаю emit copyDone();

и затем в классе
Код:
connect(&f,SIGNAL(copyDone()),SLOT(my_slot()));
т.е. получается когда сигнал с эмитится, должен вызваться этот коннект и запустится слот my_slot, так?

connect нужно вызвать до первого эмита сигнала. затем при emit copyDone() будет вызываться my_slot()


Название: Re: прогресс копирования
Отправлено: tornadodead от Март 02, 2012, 12:29
connect нужно вызвать до первого эмита сигнала. затем при emit copyDone() будет вызываться my_slot()

ну точно-же, ух и сглупил=))) Благодарю за помощь!