Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
63 / 63 / 15
Регистрация: 20.08.2014
Сообщений: 593
1

QProgressDialog

11.07.2015, 08:42. Показов 1933. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
День добрый. Собственно говоря такой вопрос:
есть некий метод, получающий данные из одной БД некоторым образом обрабатывающий их и пишущий результат в другую БД (SQLite). Процесс этот достаточно длительный. Обрабатывается порядка 6 записей в секунду. При 20-30 тысячах записей длится достаточно долго. Дабы программа не производила впечатление зависшей решено добавить диалог прогресса с возможностью отмены. Ниже приведен код, выполняющий преобразование и
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
bool UpdateDatabaseScript::unionDetailKPInfoTable()
{
    QSqlQuery   query;
    /**
      *выбираем только те записи,
      * которые уже есть в  журнале
      */
    if(query.exec(QString("SELECT * FROM %1.Diagresult  WHERE ( %1.Diagresult.id  > %2  "
                          "AND %1.Diagresult.id <  %3 )" )
                  .arg(scriptName + "blob").arg(tempId).arg(lastId))){
 
        int i = 0;
        progressDialog->show();
        while (query.next()) {
            ++i;
            progressDialog->setValue(i);
            qDebug() << progressDialog->value();
            int id = query.record().value("id").toInt();
            QArchblob tmpABLeft =  QArchblob(query.record()
                                             .value("xmlResultBuksaLeft_pack").toByteArray());
            tmpABLeft.UnPack();
            QArchblob tmpABRight =  QArchblob(query.record().
                                              value("xmlResultBuksaRight_pack").toByteArray());
            tmpABRight.UnPack();
            QString resXML = makeResultXML(tmpABLeft.toString(),
                                           tmpABRight.toString(),id,this->guid);
            insertIntoResultBlobtable(resXML,id,guid);
        }
        progressDialog->hide();
        return true;
    } else {
        return false;
    }
    return false;
Вся беда в том, что значение в диалоге не обновляется во время выполнения. Он просто не перерисовывается. Хотя значения обновляются исправно. Очевидно, что дело не в бобине, но тем не менее хотелось бы понять что я делаю не так. Не хотелось бы выносить отрисовку в отдельный поток.
Миниатюры
QProgressDialog  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2015, 08:42
Ответы с готовыми решениями:

QProgressDialog
Здравствуйте! Ситуация такая: #include &lt;QtGui/QProgressDialog&gt; #include &lt;QtGui/QLable&gt; ...

QProgressDialog остановка на 99%
Всем привет!) Подскажите как правильно работать с qprogressdialog, чтобы время выполнения функции в...

С QProgressDialog -ом не могу разобратся...
Здравствуйте. Кто небуд может мне маленкий пример показать того, как работать с QProgressDialog?...

QprogressDialog Копирование файлов
Как можно сделать, чтобы при копировании нескольких файлов qprogressdialog не создавался для...

6
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
11.07.2015, 11:25 2
C++ (Qt)
1
QCoreApplication::processEvents();
в цикле
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2015, 12:14 3
Вынести в поток.
1
63 / 63 / 15
Регистрация: 20.08.2014
Сообщений: 593
11.07.2015, 13:39  [ТС] 4
Цитата Сообщение от Avazart Посмотреть сообщение
Вынести в поток.
Не уверен, что это правильное решение.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2015, 13:41 5
Цитата Сообщение от Pingvinoff Посмотреть сообщение
Не уверен, что это правильное решение.
Ну если вам нравится когда окно программы подтормаживает используйте processEvents();
А вообще изначально стоило делать с вынесением в поток сейчас же нужно будет все перестраивать.
1
63 / 63 / 15
Регистрация: 20.08.2014
Сообщений: 593
11.07.2015, 13:46  [ТС] 6
Avazart, а пример можно, как в поток вынести, я вот с многопоточностью ни разу не работал, не считаю заданий по джаве в универе, но это было в прошлой жизни Я так понимаю, мне нужно из главного потока слать сигнал на обновление прогресса, а вспомогательный поток будет заниматься только изменением значения? Или как?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2015, 13:48 7
Примеров в документации куча, + с самим Qt идёт папка эземплсов. Кроме того есть еще книги.
1
11.07.2015, 13:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2015, 13:48
Помогаю со студенческими работами здесь

Как пользоваться Qprogressdialog
читал документацию https://doc.qt.io/qt-5/qprogressdialog.html , делаю как в примере, не...

QProgressDialog(QWidget) блокировка изменения размера виждета
Добрый день, подскажите, пожалуйста, можно ли заблокировать возможность пользовательского изменения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru