Russian Qt Forum
Ноябрь 25, 2024, 10:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕН] прогресс копирования  (Прочитано 7337 раз)
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);
    }
}
есть диалоговое окно, в котором создается новый поток, и вызывается в нем этот метод
как в прогресс отображать ход копирования?
Думаю, нужно знать общее число файлов, и при копирование очередного файла обновлять прогреес.
Дело в том, что если файлов может быть много тогда, рекурсия подсчета займет прилично времени. И как-то функция копирования должна возвращать, что очередной файл был скопирован.  Что посоветуете думаю что, уже многие что-то подобное делали.
« Последнее редактирование: Март 02, 2012, 13:24 от tornadodead » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 02, 2012, 09:26 »

Читай про сигналы/слоты.
Сначала считаешь количество файлов, потом, при копировании очередного файла, кидаешь об этом сигнал.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
tornadodead
Гость
« Ответ #2 : Март 02, 2012, 10:00 »

Читай про сигналы/слоты.
Сначала считаешь количество файлов, потом, при копировании очередного файла, кидаешь об этом сигнал.
т.е. в функции копирования, реализовать этот сигнал?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Март 02, 2012, 10:02 »

Да. Как только файл скопировался, эмитишь сигнал об этом.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
tornadodead
Гость
« Ответ #4 : Март 02, 2012, 10:24 »

Да. Как только файл скопировался, эмитишь сигнал об этом.
в методе copyFolder я сделал emit сигнала, а теперь мне как все это дело получить в окне где прогрее идет, так-же в каждом классе емитить?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Март 02, 2012, 10:34 »

Коннектишь сигнал на слот и в нем выставляешь нужный прогресс. В чем сложности?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
tornadodead
Гость
« Ответ #6 : Март 02, 2012, 10:39 »

Коннектишь сигнал на слот и в нем выставляешь нужный прогресс. В чем сложности?
в том что в классе где идет вызов копирования я не могу вызвать этот сигнал, или чет не до понимаю!!!
FileManager- класс который копирует, и содержит сигнал
connect("FileManager",SIGNAL) и нет этого сигнала=(
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Март 02, 2012, 10:46 »

Показывай код.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
tornadodead
Гость
« Ответ #8 : Март 02, 2012, 10:49 »

Показывай код.

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

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Март 02, 2012, 10:54 »

connect (&f, SIGNAL (progress (int, int)), SLOT (progress (int, int))
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
tornadodead
Гость
« Ответ #10 : Март 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("какойто слот"));
а чтоб до прогреесбар добраться, нужно еще на один уровень выше, т.е. к диалоговому окну=)
Записан
mutineer
Гость
« Ответ #11 : Март 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
Записан
tornadodead
Гость
« Ответ #12 : Март 02, 2012, 11:46 »

Ошибка, потому что твой ThreadCopy не отнаследован от QObject. вызывай QObject::connect, а не connect
а вот и нет, не в этом дело
Записан
mutineer
Гость
« Ответ #13 : Март 02, 2012, 11:50 »

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

Ну или FileManager не отнаследован от QObject
Записан
tornadodead
Гость
« Ответ #14 : Март 02, 2012, 12:21 »

ок, заработало, есть еще один ньюансик, я делаю emit copyDone();

и затем в классе
Код:
connect(&f,SIGNAL(copyDone()),SLOT(my_slot()));
т.е. получается когда сигнал с эмитится, должен вызваться этот коннект и запустится слот my_slot, так?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.