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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток всем.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2016, 13:52
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

Вот набросал тестовый проект(прикрепил к сообщению). В главном окне две кнопки, по нажатию первой вызывается 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
690 / 463 / 161
Регистрация: 01.10.2015
Сообщений: 1,272
15.03.2016, 16:47 6
у вас someLongFunction() в одном потоке с интерфейсом пользователя, она блокирует интерфейс на период своего исполнения, исполняйте эти операции в отдельном потоке.
0
13 / 7 / 5
Регистрация: 30.07.2014
Сообщений: 41
15.03.2016, 18:21  [ТС] 7
Хорошо, я добавил еще класс

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
690 / 463 / 161
Регистрация: 01.10.2015
Сообщений: 1,272
15.03.2016, 18:42 8
сигнально/слотовый механизм работает и в том случае, если объекты находятся в разных потоках
0
15.03.2016, 18:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2016, 18:42
Помогаю со студенческими работами здесь

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

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

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

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


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

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