Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567

QDialog вызов функции после exec()

05.10.2017, 10:59. Показов 8133. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Мне надо после того как окно диалога появилось вызвать код. А конкретно запустить поток.
Используя перегрузку exec() код вызывается до вызова функции exec().
Используя перегрузку showEvent() тот же эффект.

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
void ProcessFormDialog::showEvent(QShowEvent* event) {
    QDialog::showEvent(event);
 
    /**/
    ProcessFormThread thread;
    ProcessFormWorker worker;
 
    worker.setLabel(label);
    worker.setKeyAES(keyAES);
    worker.setFormType(formType);
    worker.setTotalNumberForms(totalNumberForms);
 
    QObject::connect(&worker, SIGNAL(valueChanged(int)),
                     item, SLOT(displayProcess(int)));
    worker.moveToThread(&thread);
    QObject::connect(&worker, SIGNAL(finished()),
                     &thread, SLOT(quit()));
 
   thread.start();
    worker.doWork();
    /**/
 
    qcout << TAG << "show event" << endl;
}
Добавлено через 39 минут
Если вызывать код после вызова


C++ (Qt)
1
2
3
4
5
ProcessFormDialog dlg;
 
dlg.exec();
 
// call code
То этот код будет вызван после того как будет вызван сигнал:
accepted()
rejected()

Кнопки OK или CANCEL
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.10.2017, 10:59
Ответы с готовыми решениями:

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

QDialog, QApplication и exec()
Пишу программу, есть окно авторизации. Собственно в main создаю диалог авторизации (LoginDialog) и необходимо ждать ввода данных от юзера и...

QDialog setVisible прерывает exec?
Добрый вечер форумчане! Столкнулся с такой проблемой - имеется диалог в нем инкапсулирован другой диалог, при нажатии на кнопку первого -...

33
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567
05.10.2017, 21:37  [ТС]
Студворк — интернет-сервис помощи студентам
Вот делаю как рекомендуют колеги, но те же ошибки:

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
ProcessFormDialog::ProcessFormDialog(QWidget * parent) : QDialog(parent) {
    setWindowTitle(tr("Process form"));
    setObjectName("process-form-dialog");
 
    setWindowFlags(Qt::Window | Qt::WindowSystemMenuHint);
    setWindowIcon(QIcon(":/image/generate-icon.png"));
 
    /* In future create new method */
    setupProgressItem();
 
    initArea();
 
    QObject::connect(&thread, SIGNAL(finished()),
                     this, SLOT(close()));
    thread.start();
 
    qcout << TAG << "ctr dlg call" << endl;
}
 
void ProcessFormDialog::showEvent(QShowEvent* event) {
    QDialog::showEvent(event);
 
    /**/
    worker.setLabel(label);
    worker.setKeyAES(keyAES);
    worker.setFormType(formType);
    worker.setTotalNumberForms(totalNumberForms);
 
    QObject::connect(this, SIGNAL(started()),
                     &worker, SLOT(doWork()),
                     Qt::QueuedConnection);
 
    worker.moveToThread(&thread);
 
    QObject::connect(&worker, SIGNAL(valueChanged(int)),
                     item, SLOT(display(int)));
    QObject::connect(&worker, SIGNAL(finished()),
                     &thread, SLOT(quit()));
 
    emit started();
    /**/
 
    qcout << TAG << "show event" << endl;
}
Добавлено через 2 минуты
Bash
1
2
3
4
5
6
ASSERT failure in QCoreApplication::sendEvent:
 "Cannot send events to objects owned by a different thread. 
Current thread 288bfc. Receiver 'qt_menubar_ext_button'
 (of type 'QToolButton') was created in thread 1c178880", file kernel\qcoreapplication.cpp, line 541
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
05.10.2017, 21:50
Вынеси всё это дерьмо из класса диалога в класс, где этот диалог создаётся. Что за чудачество, писать логику в UI?!? Создаёшь диалог, запускаешь поток, выполняешь exec, всё в одном месте. Можешь даже через сигналы-слоты это всё выполнять, цепляешь exec к started, finished к close.
Worker - это виджет QToolButton? Виджеты вне основного потока не работают, даже не понятно, почему Qt на перемещении не упало. Ради них, виджетов, вообще все эти сигналы и делались, чтобы ui не расплывалось сообщениями по потокам. Поверь, ты не захочешь 4 очереди сообщений, сражающихся за сообщения о положении курсора.
0
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567
06.10.2017, 11:06  [ТС]
Можешь показать на примере, как это сделать на моем примере.

Добавлено через 9 минут
Я попробовал как вы сказали и все те же ошибки

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
ProcessFormDialog dialog;
                ProcessFormThread thread;
                ProcessFormWorker worker;
/*
                dialog.setLabel(label);
                dialog.setKeyAES(key);
                dialog.setFormType(formType);
                dialog.setTotalNumberForms(totalNumberForms);
*/
                worker.setLabel(label);
                worker.setKeyAES(key);
                worker.setFormType(formType);
                worker.setTotalNumberForms(totalNumberForms);
 
                QObject::connect(&dialog, SIGNAL(started()),
                                 &worker, SLOT(doWork()), Qt::QueuedConnection);
                QObject::connect(&worker, SIGNAL(valueChanged(int)),
                                 dialog.getItem(), SLOT(display(int)));
 
                worker.moveToThread(&thread);
 
                QObject::connect(&worker, SIGNAL(finished()),
                                 &thread, SLOT(quit()));
                thread.start();
                emit dialog.started();
 
                if (dialog.exec() == QDialog::Accepted) {
                    qcout << TAG << "Dialog was closed!" << endl;
                }
Добавлено через 12 секунд
Все крушится.

Добавлено через 2 минуты
Когда сделать вот так, то окно показывается, но замерает и когда я нажимаю выйти все крушится

C++ (Qt)
1
2
3
4
5
if (dialog.exec() == QDialog::Accepted) {
     qcout << TAG << "Dialog was closed!" << endl;
}
 
emit dialog.started();
Добавлено через 1 час 12 минут
Как можно это исправить?
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
06.10.2017, 11:36
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
Можешь показать на примере, как это сделать на моем примере.
Нет. Я в душе не представляю, что такие ProcessFormThread и ProcessFormWorker.
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
все те же ошибки
Потому что GUI класс оказывается вне GUI потока. Он и будет писать ошибки. Потому что ProcessFormWorker должен быть QObject. А не QWidget. И ты его в любом случае не увидишь.
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
Все крушится.
Повангую
C++ (Qt)
1
2
3
4
5
6
7
8
9
ProcessFormWorker * worker = new ProcessFormWorker ();
worker->moveToThread(&thread);
 
QObject::connect(&thread, SIGNAL(started()), worker, SLOT(doWork()));
QObject::connect(&thread, SIGNAL(started()), &dialog, SLOT(exec()));
QObject::connect(worker, SIGNAL(finished()), &thread, SLOT(quit()));
QObject::connect(worker, SIGNAL(finished()), &dialog, SLOT(close()));
 
thread.start();
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
06.10.2017, 11:43
Цитата Сообщение от icpu Посмотреть сообщение
Потому что ProcessFormWorker должен быть QObject
вроде бы он им и является -
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
// *.hpp
class ProcessFormWorker : public QObject {
скорее всего, что-то пытается взаимодействовать с интерфейсом внутри
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
C++ (Qt)
1
2
* * prepareQrCodeSession(numberUsers);
* * saveFormsSession();
и это и приводит к вылету. Хотя то, что при создании ProcessFormWorker статическим, он должен удаляться по завершении выполнения функции - это да. Но у М.Шлее кстати именно так и сделано, почему-то. Хоть и в функции main().
0
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567
06.10.2017, 12:00  [ТС]
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
class ProcessFormWorker : public QObject {
    Q_OBJECT
public:
    ProcessFormWorker(QObject* parent = nullptr);
    ~ProcessFormWorker();
 
    void setLabel(const string& label);
    void setKeyAES(const string& key);
    void setFormType(int formType);
    void setTotalNumberForms(int totalNumberForms);
 
signals:
    void valueChanged(int);
    void finished();
 
public slots:
    void doWork();
 
private:
    void prepareQrCodeSession(int numberUsers);
    void saveFormsSession();
    void reviewQrCode(string& mask);
};
 
SLOT_DEFINE
void ProcessFormWorker::doWork() {
    int numberUsers = totalNumberForms / formType;
 
#ifndef debug
    qcout << TAG << "total number forms: " << totalNumberForms << endl;
    qcout << TAG << "form type: " << formType << endl;
    qcout << TAG << "number users: " << numberUsers << endl;
#endif
 
    prepareQrCodeSession(numberUsers);
    saveFormsSession();
}
Добавлено через 1 минуту
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
ProcessFormThread::ProcessFormThread() {
 
}
 
void ProcessFormThread::run() {
    qcout << TAG << "Thread PFT was started ..." << endl;
 
    exec();
}
 
ProcessFormThread::~ProcessFormThread() {
 
}
Добавлено через 7 минут
Тоесть Worker мы помещаем в поток, который запускает цикл обработки событий.

Добавлено через 2 минуты
Вот так попробовал, но ошибка та же

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
 ProcessFormDialog dialog;
                ProcessFormThread thread;
                ProcessFormWorker worker;
/*
                dialog.setLabel(label);
                dialog.setKeyAES(key);
                dialog.setFormType(formType);
                dialog.setTotalNumberForms(totalNumberForms);
*/
                worker.setLabel(label);
                worker.setKeyAES(key);
                worker.setFormType(formType);
                worker.setTotalNumberForms(totalNumberForms);
 
                worker.moveToThread(&thread);
 
                QObject::connect(&thread, SIGNAL(started()), &worker, SLOT(doWork()), Qt::QueuedConnection);
                QObject::connect(&thread, SIGNAL(started()), &dialog, SLOT(exec()));
 
                QObject::connect(&worker, SIGNAL(valueChanged(int)),
                                 dialog.getItem(), SLOT(display(int)));
 
                QObject::connect(&worker, SIGNAL(finished()), &thread, SLOT(quit()));
                QObject::connect(&worker, SIGNAL(finished()), &dialog, SLOT(close()));
 
                thread.start();
 
                if (dialog.exec() == QDialog::Accepted) {
                    qcout << TAG << "Dialog was closed!" << endl;
                }
 
                emit dialog.started();
Bash
1
2
3
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 288c84. Receiver 'qt_menubar_ext_button' (of type 'QToolButton') was created in thread 1bf11ac0", file kernel\qcoreapplication.cpp, line 541
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
Добавлено через 36 секунд
Как и раньше обговаривали
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
06.10.2017, 12:11
Kotik_leapold, временно отключи prepareQrCodeSession(numberUsers) и saveFormsSession(). Посмотри, останется ли вылет. Потом добавь их по одному.
0
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567
06.10.2017, 12:38  [ТС]
Окей! Сейчас проверю!

Добавлено через 7 минут
Окно показывается. Но обработка не выполняется. Это понятно

C++ (Qt)
1
2
QObject::connect(&worker, SIGNAL(valueChanged(int)),
                                 dialog.getItem(), SLOT(display(int)));

Сигнал не вызывается.
Но когда я хочу закрыть диалог, то

В логе вот таке показывается

Bash
1
2
3
4
5
6
[PFD-TAG]  ctr dlg call 
 
[PFD-TAG]  show event 
 
QDialog::exec: Recursive call detected
[PFD-TAG]  Thread PFT was started ...
выбивает ошибку

Bash
1
2
3
QThread: Destroyed while thread is still running
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
0
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567
06.10.2017, 12:39  [ТС]
Вот так
Миниатюры
QDialog вызов функции после exec()  
0
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567
06.10.2017, 13:09  [ТС]
После закрытия окна все ламается.

Добавлено через 28 минут
Как можно это исправить.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
06.10.2017, 13:36
C++ (Qt)
1
2
3
4
5
6
7
                thread.start();
 
                if (dialog.exec() == QDialog::Accepted) {
                    qcout << TAG << "Dialog was closed!" << endl;
                }
                thread.exit();
                thread.wait();
Добавлено через 1 минуту
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
QDialog::exec: Recursive call detected
http://www.qtcentre.org/thread... l-detected
1
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567
06.10.2017, 14:09  [ТС]
Если добавить, две строки и закоментировать то программа не падает
но строчка все равно показывается.

Bash
1
QDialog::exec: Recursive call detected
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
06.10.2017, 14:48
Цитата Сообщение от Kotik_leapold Посмотреть сообщение
[PFD-TAG] *show event
QDialog::exec: Recursive call detected
из ProcessFormDialog::showEvent(QShowEvent* event) всё лишнее удалено?
0
 Аватар для Kotik_leapold
111 / 98 / 84
Регистрация: 18.12.2015
Сообщений: 567
06.10.2017, 15:01  [ТС]
Надо удалить в ProcessFormDialog.

Это поможет? Хорошо попробую и очищу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.10.2017, 15:01

Вызов QDialog::Accepted
Здравствуйте! На форму кинул QDialogButtonBox. Сам класс формы наследуется от QDialog. При нажатии &quot;ОК&quot; ничего не...

Для чего необходим вызов метода exec()?
Не очень понял для чего нужен метод exec()... Он запускает цикл обработки событий, но мыже в любом наследнике QObject можем работать с...

Вызов функции после создания окна приложения
Здравствуйте, есть программа в которой создаються виджеты (QPlaintTextEdit), после их создания, вызывается функция (умовно void download())...

Вызов функции из другой функции после нажатия на кнопку
Помогите, пожалуйста! Никак не могу понять почему не запускается функция d() Полный код: &lt;script language=&quot;javascript&quot;&gt;...

Вызов функции после некоторого времени
У меня есть функция котороя обновляет интерфейс.Она меняет поле Title,BackGroundImage. -(void)setCardWrap:(NSUInteger)index//need to...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru