Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/76: Рейтинг темы: голосов - 76, средняя оценка - 4.54
13 / 7 / 5
Регистрация: 30.07.2014
Сообщений: 41

Окно ожидания завершения операции, пустой QDialog

15.03.2016, 13:52. Показов 15097. Ответов 7

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем.
Qt 5.3.2, Qt Creator 3.2.1

Пытаюсь сделать QDialog с QProgressBar (или QProgressDialog), который во время каких-то длительных операций появляется на экране и прогресс-бар постоянно крутится до завершения операции.

C++ (Qt)
1
2
3
4
5
6
7
QDialog *waitingDialog = new QDialog;
QProgressBar progressBar = new QProgressBar(waitingDialog);
progressBar->setRange(0, 0);
progressBar->setFormat("Operation");
QVBoxLayout *waitingDialog_layout = new QVBoxLayout;
waitingDialog_layout->addWidget(progressBar);
waitingDialog->setLayout(waitingDialog_layout );
Далее различными способами пробовал показать диалог
C++ (Qt)
1
2
waitingDialog->exec();  //естественно, блокирует дальнейшее выполнение до закрытия диалога
... занимаемся всякими операциями
C++ (Qt)
1
2
3
waitingDialog->show();  //показывает диалог, но пустой
... занимаемся всякими операциями
waitingDialog->close();
Пробовал после поисков добавить обработку событий
C++ (Qt)
1
2
3
4
waitingDialog->show();  //показывает диалог, но пустой
qApp->processEvents(); //или QApplication::processEvents
... занимаемся всякими операциями
waitingDialog->close();
и задать родителя для waitingDialog - QMainWindow
C++ (Qt)
1
QDialog *waitingDialog = new QDialog(this);
Но толку ноль, появляется окно диалога без содержимого. Думал, может дело в QProgressBar, но заменял его на QPushButton, но ничего не изменилось.
Спасибо за помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.03.2016, 13:52
Ответы с готовыми решениями:

Время ожидания выполнения истекло. Время ожидания истекло до завершения операции, или сервер не отвечает
Всем доброго времени суток! Имею самописную программку, которая на основании отмеченных пользователем критериев генерирует скрипт и...

Как увеличить время ожидания до завершения операции TableAdapter.Fill()?
При попытке выполнить запрос через TableAdapter превышающий 30 сек выдается ошибка "Истекло время ожидания". Как увеличить это...

Ожидания завершения метода
Добрый день! Возник вопрос, не могу понять как правильно сделать. Задача вот в чем. Есть проект в котором одно окно. Все методы...

7
692 / 464 / 162
Регистрация: 01.10.2015
Сообщений: 1,273
15.03.2016, 14:02
а чем вас не устраивает QProgressDialog ?
0
13 / 7 / 5
Регистрация: 30.07.2014
Сообщений: 41
15.03.2016, 14:11  [ТС]
Устраивает, только он ведет себя так же, появляется пустой диалог без виджета.

UPD: если запустить qApp->processEvents(); два раза последовательно, то появляется окно диалога с виджетами, но замороженными
0
692 / 464 / 162
Регистрация: 01.10.2015
Сообщений: 1,273
15.03.2016, 14:29
Цитата Сообщение от lonfort Посмотреть сообщение
появляется пустой диалог без виджета.
весь проект в архиве выложить можете?

Добавлено через 13 минут
попробовал запустить приведенный вами код, жалуется при компиляции на строку

C++ (Qt)
1
QProgressBar progressBar = new QProgressBar(waitingDialog);
т.к. пропущена "звездочка" перед именем progressBar, но это скорее всего просто опечатка, допущенная при написании сообщения. После исправления все работает.
0
13 / 7 / 5
Регистрация: 30.07.2014
Сообщений: 41
15.03.2016, 16:05  [ТС]
Да, опечатался.

Вот набросал тестовый проект(прикрепил к сообщению). В главном окне две кнопки, по нажатию первой вызывается QDialog + QProgressBar, по нажатию второй QProgressDialog, затем вызывается а-ля длительная функция (ping), и пока она работает, окно диалога пустое. В реальности вместо пинга всякие операции типа перемещения файлов или запуска внешних программ, не стал их лепить сюда, чтобы не усложнять, суть одна и та же.

.pro
Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = progressTest
TEMPLATE = app
 
 
SOURCES += main.cpp\
        mainwindow.cpp
 
HEADERS  += mainwindow.h
 
FORMS    +=


mainwindow.h
Кликните здесь для просмотра всего текста

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
35
36
37
38
39
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
class QDialog;
class QPushButton;
class QProgressBar;
class QProgressDialog;
 
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
 
    QDialog *waitingDialog;
 
    QPushButton *button1;
    QPushButton *button2;
 
    QProgressBar *progressBar;
 
    QProgressDialog *progressDialog;
 
    void someLongFunction();
 
private slots:
    void startOperation1();
    void startOperation2();
 
};
 
#endif // MAINWINDOW_H


mainwindow.cpp
Кликните здесь для просмотра всего текста

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "mainwindow.h"
 
#include <QtWidgets>
#include <QProcess>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{    
    button1 = new QPushButton(this);
    button1->setText("Start operation - QDialog");
    button2 = new QPushButton(this);
    button2->setText("Start operation - QProgressDialog");
 
    waitingDialog = new QDialog;
    progressBar = new QProgressBar(waitingDialog);
    progressBar->setRange(0, 0);
    progressBar->setFormat("operation");
    QVBoxLayout *waitingDialog_layout = new QVBoxLayout;
    waitingDialog_layout->addWidget(progressBar);
    waitingDialog->setLayout(waitingDialog_layout);
    waitingDialog->resize(200, 30);
 
    progressDialog = new QProgressDialog;
    progressDialog->setRange(0, 0);
    progressDialog->setWindowTitle("Operation");
    progressDialog->setCancelButton(0);
    progressDialog->setLabelText("operation");
    progressDialog->resize(200, 30);
 
    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(button1);
    mainLayout->addWidget(button2);
 
    QWidget *mainWidget = new QWidget(this);
    mainWidget->setLayout(mainLayout);
 
    this->setCentralWidget(mainWidget);
 
    QObject::connect(button1,  SIGNAL(clicked()), this, SLOT(startOperation1()));
    QObject::connect(button2,  SIGNAL(clicked()), this, SLOT(startOperation2()));
}
 
MainWindow::~MainWindow()
{
 
}
 
void MainWindow::startOperation1()
{
    waitingDialog->show();
 
    someLongFunction();
 
    waitingDialog->close();
}
 
void MainWindow::startOperation2()
{
    progressDialog->show();
 
    someLongFunction();
 
    progressDialog->close();
}
 
void MainWindow::someLongFunction()
{
    QProcess *someProcess = new QProcess(this);
    QString program("ping.exe");
    QStringList args;
    args << "127.0.0.1";
    someProcess->execute(program, args);
}


main.cpp
Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "mainwindow.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    return a.exec();
}
Вложения
Тип файла: zip progressTest.zip (4.9 Кб, 10 просмотров)
0
692 / 464 / 162
Регистрация: 01.10.2015
Сообщений: 1,273
15.03.2016, 16:47
у вас someLongFunction() в одном потоке с интерфейсом пользователя, она блокирует интерфейс на период своего исполнения, исполняйте эти операции в отдельном потоке.
0
13 / 7 / 5
Регистрация: 30.07.2014
Сообщений: 41
15.03.2016, 18:21  [ТС]
Хорошо, я добавил еще класс

longclass.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "LongClass.h"
#include <QDebug>
#include <QProcess>
 
LongClass::LongClass()
{
}
LongClass::~LongClass()
{
}
 
void LongClass::process()
{
    QProcess *someProcess = new QProcess(this);
    QString program("ping.exe");
    QStringList args;
    args << "127.0.0.1";
    someProcess->execute(program, args);
    emit finished();
}
longclass.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef LONGCLASS_H
#define LONGCLASS_H
#include <QObject>
 
class LongClass : public QObject
{
    Q_OBJECT
 
public:
    LongClass();
    ~LongClass();
 
public slots:
    void process();
 
signals:
    void finished();
    void error(QString err);
};
 
#endif // LONGCLASS_H
и вызываю теперь
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void MainWindow::startOperation1()
{
    waitingDialog->show();
 
    QThread* thread = new QThread;
    LongClass* longClass = new LongClass();
    longClass->moveToThread(thread);
    connect(longClass, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
    connect(thread, SIGNAL(started()), longClass, SLOT(process()));         //наши долгие операции
    connect(longClass, SIGNAL(finished()), thread, SLOT(quit()));
    connect(longClass, SIGNAL(finished()), this, SLOT(closeDialog()));       //закрываем waitingDialog
    connect(longClass, SIGNAL(finished()), longClass, SLOT(deleteLater()));
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}
И оно наконец крутится как надо.
Но что делать, если мне нужны какие-то операции с GUI (работа с view/model , запись через QSqlQuery), ну и вообще работа с оригинальным классом?
0
692 / 464 / 162
Регистрация: 01.10.2015
Сообщений: 1,273
15.03.2016, 18:42
сигнально/слотовый механизм работает и в том случае, если объекты находятся в разных потоках
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.03.2016, 18:42
Помогаю со студенческими работами здесь

Скрипт ожидания завершения процессов
Доброго времени суток, я обычный офисный работник по этому не селен вообще ни в чем, ( сильно не пинайте ), Стоит задача сделать скрипт...

QDialog окно и приостановка выполнения
Есть форма QDialog, и нужно что-бы при ее вызове последующий код выполнялся только после ее закрытия. Слышал про метод showModal() в...

После завершения процесса он остается в режиме ожидания
Доброго времени суток! Написал небольшую консольную програмку на C++, работает под убунтой, задача ее простая - читать данные из com...

Ввод и вывод в python без ожидания завершения программы
Есть скрипт на python, который должен принимать на вход значения, обрабатывать их и выводить. Суть в том, что все значения подаются не...

Разница между QDialog::exec() и QDialog::Open()
Здравствуйте, уважаемые форумчане! Есть статический метод, который установлен как callback-функция хука для событий клавиатуры. ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru