Поиск:

Ответ в темуСоздание новой темы Создание опроса
> qfilesystemmodel+прогресс бар 
:(
    Опции темы
koldun90
Дата 25.5.2014, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



Здравствуйте у меня два вопроса:
1) Скажите что лучше использовать для отображения прогресса копирования файла в директории лучше использовать qprogressdialog или qprogressbar?
Потом как реализовать прогресс бар чтобы он показывал время сколько осталось до окончания копирования и скорость?

2)Мне нужно изменить отрисовку папок qfilesystemmodel я соответственно нашел в интернете что надо наследоваться и переопределить метод data

myqfilesystemmodel.h
Код

#ifndef MYQFILESYSTEMMODEL_H
#define MYQFILESYSTEMMODEL_H

#include <QFileSystemModel>
#include <QVariant>
#include "ui_mainwindow.h"

class myqfilesystemmodel : public QFileSystemModel
{
    Q_OBJECT
public:
    myqfilesystemmodel(QObject *parent = 0);
    QVariant data(const QModelIndex &index, int role) const;
    
signals:
    
public slots:
    
};

#endif // MYQFILESYSTEMMODEL_H


myqfilesystemmodel.cpp

Код

#include "myqfilesystemmodel.h"

myqfilesystemmodel::myqfilesystemmodel(QObject *parent) :
    QFileSystemModel(parent)
{
}

QVariant myqfilesystemmodel::data(const QModelIndex &index, int role) const
{
        if (fileInfo(index).isDir())
        {
            if( role == Qt::DecorationRole )
            {
               return QPixmap("C:/nor.PNG");
            }
        }
    return QFileSystemModel::data(index, role);
}




соответственно конструктор mainwindow.cpp
Код

 model3=new myqfilesystemmodel;
 model3->setRootPath(QDir::currentPath());
    model3->setFilter(QDir::AllDirs | QDir::Files |QDir::NoDotAndDotDot);
    model3->setReadOnly(false);
    ui->treeView_3->setModel(model3);


Соответственно проблема у меня такая вот скриншот как выглядят папки
user posted image

Но мне нужно чтобы значок папки отображался только в первом столбце(как и в стандартной qfilesystemmodel) , а не во всех как мне это сделать?



Это сообщение отредактировал(а) koldun90 - 25.5.2014, 19:54
PM MAIL   Вверх
borisbn
Дата 26.5.2014, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Ответ на второй вопрос:
Код
   if ( index.column() == 0 && fileInfo(index).isDir() ) {
       ...
   }


Первого вопроса не понял...
QProgressBar - это просто "полоска" с индикатором процента выполнения.
QProgressDialog - это окошко с QProgressBar'ом и кнопкой "Отмена", на которую можно подписаться и завершить работу.
Цитата(koldun90 @  25.5.2014,  14:37 Найти цитируемый пост)
 как реализовать прогресс бар чтобы он показывал время сколько осталось до окончания копирования и скорость?

Для начала нужно вычислить полный объём, занимаемый всеми файлами, затем при копировании очередного файла добавить его размер к тому, что уже скопировалось и разделить на общее время, прошедшее с начала копирования. Получишь скорость копирования. Разделив оставшийся объём на эту скорость получишь оставшееся время.
Псевдо код:
Код
QTime firstTime = now();
unsigned long long wholeSize = 0;
for ( auto file : files ) {
    wholeSize += file.size();
}
unsigned long long copiedSize = 0;
int i = 0;
int filesCount = files.size();
for ( auto file : files ) {
    copyFile( file );
    copiedSize += file.size();
    int speed = copiedSize / ( now() - firstTime );
    int elapsedTime = ( wholeSize - copiedSize ) / speed;
    showProgress( i / (double)filesCount * 100, speed, elapsedTime );
    i++;
}


Это сообщение отредактировал(а) borisbn - 26.5.2014, 08:27


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
koldun90
Дата 26.5.2014, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



Цитата(borisbn @ 26.5.2014,  08:26)
Ответ на второй вопрос:
Код
   if ( index.column() == 0 && fileInfo(index).isDir() ) {
       ...
   }


Первого вопроса не понял...
QProgressBar - это просто "полоска" с индикатором процента выполнения.
QProgressDialog - это окошко с QProgressBar'ом и кнопкой "Отмена", на которую можно подписаться и завершить работу.
Цитата(koldun90 @  25.5.2014,  14:37 Найти цитируемый пост)
 как реализовать прогресс бар чтобы он показывал время сколько осталось до окончания копирования и скорость?

Для начала нужно вычислить полный объём, занимаемый всеми файлами, затем при копировании очередного файла добавить его размер к тому, что уже скопировалось и разделить на общее время, прошедшее с начала копирования. Получишь скорость копирования. Разделив оставшийся объём на эту скорость получишь оставшееся время.
Псевдо код:
Код
QTime firstTime = now();
unsigned long long wholeSize = 0;
for ( auto file : files ) {
    wholeSize += file.size();
}
unsigned long long copiedSize = 0;
int i = 0;
int filesCount = files.size();
for ( auto file : files ) {
    copyFile( file );
    copiedSize += file.size();
    int speed = copiedSize / ( now() - firstTime );
    int elapsedTime = ( wholeSize - copiedSize ) / speed;
    showProgress( i / (double)filesCount * 100, speed, elapsedTime );
    i++;
}

а как считаете что лучше использовать для отображения процесса копирования qprogressdialog или qprogressbar?
Также какой компонент использовать для отчета времени?
и скажи как мне сделать чтобы qfilesystemmodel отображал только каталог /mnt? (куда примонтируются внешние носители)

Это сообщение отредактировал(а) koldun90 - 26.5.2014, 19:37
PM MAIL   Вверх
borisbn
Дата 27.5.2014, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(koldun90 @  26.5.2014,  19:14 Найти цитируемый пост)
что лучше использовать для отображения процесса копирования qprogressdialog или qprogressbar?

Если нужно, чтобы процесс можно было прервать, то QProgressDialog.
Цитата(koldun90 @  26.5.2014,  19:14 Найти цитируемый пост)
какой компонент использовать для отчета времени?

QLabel
Цитата(koldun90 @  26.5.2014,  19:14 Найти цитируемый пост)
как мне сделать чтобы qfilesystemmodel отображал только каталог /mnt?

QFileSystemModel::setRootPath

А самому по документации (кстати, одной из лучших) трудно поискать ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
koldun90
Дата 30.5.2014, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



Цитата(borisbn @ 27.5.2014,  12:53)
Цитата(koldun90 @  26.5.2014,  19:14 Найти цитируемый пост)
что лучше использовать для отображения процесса копирования qprogressdialog или qprogressbar?

Если нужно, чтобы процесс можно было прервать, то QProgressDialog.
Цитата(koldun90 @  26.5.2014,  19:14 Найти цитируемый пост)
какой компонент использовать для отчета времени?

QLabel
Цитата(koldun90 @  26.5.2014,  19:14 Найти цитируемый пост)
как мне сделать чтобы qfilesystemmodel отображал только каталог /mnt?

QFileSystemModel::setRootPath

А самому по документации (кстати, одной из лучших) трудно поискать ?

А не подскажете вот вы написали вот часть кода
Код

showProgress( i / (double)filesCount * 100

я так понял 
i- это как бы счетчик? ТЕ мы как бы после копирования первого файла
делаем так 1/размер файла(в байтах) * 100?
те у нас прогресс бар заполняется как бы так да
Код

1/размер файла(в байтах) * 100


потом второй файл 
Код

2/размер файла(в байтах) * 100

и так далее да?

и скажите 100 мы умножаем на числитель или знаменатель?
PM MAIL   Вверх
borisbn
Дата 31.5.2014, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



В знаменателе не размер файла, а общее количество файлов. i/кол-во файлов × 100 - это сколько файлов уже скопировалось в процентах от общего количества.
На 100 умножается результат деления i на знаменатель. Т.е. на числитель


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
koldun90
Дата 31.5.2014, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



Цитата(borisbn @ 31.5.2014,  08:00)
В знаменателе не размер файла, а общее количество файлов. i/кол-во файлов × 100 - это сколько файлов уже скопировалось в процентах от общего количества.
На 100 умножается результат деления i на знаменатель. Т.е. на числитель

вроде реализовал по вашему но
Код

int i = 0;

мне кажется i должно быть в начале установлено в единицу а не в ноль
PM MAIL   Вверх
borisbn
Дата 31.5.2014, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(koldun90 @  31.5.2014,  14:37 Найти цитируемый пост)
мне кажется i должно быть в начале установлено в единицу а не в ноль 

Согласен.
А ещё лучше так сделать:
Код
    showProgress( copiedSize / (double)wholeSize * 100, speed, elapsedTime );

а i вообще убрать


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
koldun90
Дата 31.5.2014, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



Цитата(borisbn @ 31.5.2014,  14:39)
Цитата(koldun90 @  31.5.2014,  14:37 Найти цитируемый пост)
мне кажется i должно быть в начале установлено в единицу а не в ноль 

Согласен.
А ещё лучше так сделать:
Код
    showProgress( copiedSize / (double)wholeSize * 100, speed, elapsedTime );

а i вообще убрать

но я так понял это как бы примитивный прогресс бар..
те допустим скопировали мы этот файл и увеличили как бы процент чтоль от общего числа файлов
допустим:

копируем 5 файлов:

1)Прогресс бар увеличивается после копирования 1 файла
(1/5)*100=20 процентов

2) 40

3) 60 и тд ну вы поняли

а допустим возможно сделать так: к примеру я копирую файл 4 Gb

и мне же нужно как бы чтоб он отображал процесс копирования всех этих 4 GB

вот так допустим
user posted image
те отображается полоска которая сколько скопировано мегабайт в файле
PM MAIL   Вверх
math64
Дата 1.6.2014, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



В таком случае showProgress() должен вызываться из copyFile() после копирования порции данных.
PM   Вверх
borisbn
Дата 1.6.2014, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



> В таком случае showProgress() должен вызываться из copyFile()
Тогда уж из CopyFileEx
Хотя, судя по
> как мне сделать чтобы qfilesystemmodel отображал только каталог /mnt?
у ТС Linux,  а как там это делается - я хз((


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 1.6.2014, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



copyFile() - не системная функция, метод класса, который вручную копирует файл
Код

class FileCopier {
public:
  FileCopier(const QList<QFile>& files, ...);
  void copyFile(...);
  void showProgress(...);
  ...
private:
  QList<QFile> sourceFiles;
  int currentFile;
  long long copiedSize;
  long long  totalSize;
  QDialog* progressDialog;
  QProgressBar* progressBar;
  QLabel* label;
  ...
}

PM   Вверх
koldun90
Дата 1.6.2014, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



вообщем у меня в итоге небольшая проблемка возникла

вот часть кода которая запускает копирование
mainwindow.cpp

Код

pr=new processdialog;   //создаем объект класса   processdialog это собственно окно с прогресс баром
                pr->show();    //показываем окно
                t->start();   // запускаем таймер
connect(this,SIGNAL(progress(unsigned long long,unsigned long long,unsigned long long,int,int)),pr,SLOT(process(unsigned long long,unsigned long long,unsigned long long,int,int)));  // создаем коннект
for (int i=0; i<path.size(); i++)
                {
                    QString str=path[i];
                    vsefaily=vsefaily+razmer_failov(str);    // здесь в цикле мы вычисляем размер(вес) всех файлов выбранных для копирования


                }

                for (int i=0;i<path.size();i++)
                {

                        QString str=path[i];
                        QFileInfo tr(str);
                        QString base_name=tr.fileName();  
                        if (tr.isFile())  
                        {   

                              QFile file;

                              bool ee=file.copy(str,path2[0]+"/"+base_name);  // собственно копируем файл
                              if (ee)
                              {

                                  copiedsize=copiedsize+tr.size();     // добавляем сколько в сколько скопировано
                                  speed=copiedsize/t->elapsed();    // рассчитываем скорость
                                  elapsedtime=(vsefaily-copiedsize)/speed;     // рассчитываем оставшееся время
                                  emit progress(copiedsize,speed,elapsedtime,qq,rt); далее мы испускаем сигнал который ловится уже в progressdialog(rt=1 в начале)
                                  rt=rt+1;
                              }

                        }


                }




progressdialog.cpp
Код

#include "processdialog.h"
#include "ui_processdialog.h"



processdialog::processdialog(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::processdialog)
{
    ui->setupUi(this);


}

processdialog::~processdialog()
{
    delete ui;

}

void processdialog::process(unsigned long long skopirovano, unsigned long long skorost, unsigned long long ostavvremy, int kolvofailov, int rt)   ссоответсвенно выполняется слот который должен заполнить прогресс бар
{

    rez=(rt/kolvofailov)*100;       

    ui->progressBar->setValue(rez);  // собствеено заполняем прогресс бар

}




так вот проблема в следующем что появляется окно как бы допустим копирую 5 файлов. Соответственно копируется 5 файлов и прогресс бар сразу на 100
а должно быть так 20 40 60 80 100. ТО прогресс бар как бы не заполняется постепенно 20 40 и тд. А прям мгновенно до 100 процентов
Как мне это исправить?

все переменный rt и kolvo failov верны распечатывал
допустим копирую 5 файлов:

1) на первом шаге rt =1      kolvofailov=5     20 проц

2) rt=2  kolvofailov=5    40 проц

3)rt=3   kolvofailov=5    60 проц

4)rt=4  kolvofailov=5    80 проц

5) rt=5  kolvofailov=5   100 проц

Так вот что мне делать то ведь прогресс бар не заполнятеся 20 40 60 80 100

а он сразу на 100 процентов

Это сообщение отредактировал(а) koldun90 - 1.6.2014, 12:54
PM MAIL   Вверх
math64
Дата 1.6.2014, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Промежуточные результаты не успевают отображаться.
Если используется QProgressDialog нужно делать так:
Код

        QProgressDialog progress;
        ...
        for(...) {
            Application::processEvents();
            if (progress.wasCanceled())
                break;
            ...
        }


Добавлено через 9 минут и 16 секунд
но лучше делать на отдельной нити или использовать QtConcurent - тогда можно копировать одновременно несколько файлов - нужно переделать  пример Qt с загрузкой рисунков.
PM   Вверх
koldun90
Дата 1.6.2014, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 16.5.2014

Репутация: нет
Всего: нет



Цитата(math64 @ 1.6.2014,  15:10)
Промежуточные результаты не успевают отображаться.
Если используется QProgressDialog нужно делать так:
Код

        QProgressDialog progress;
        ...
        for(...) {
            Application::processEvents();
            if (progress.wasCanceled())
                break;
            ...
        }


Добавлено @ 15:19
но лучше делать на отдельной нити или использовать QtConcurent - тогда можно копировать одновременно несколько файлов - нужно переделать  пример Qt с загрузкой рисунков.

использую qprogressbar
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.