call the dialog inside the loop
Unsolved
General and Desktop
-
How can I call a dialog inside a loop process, I tried this but when the dialog appears the application becomes "Not responding", how can I solve this?
void MainWindow::MyProcess() { for (;;) { if (result) { // code process .... } else { // result failed CMessageBox dialog; dialog.setMessage(Critical, "Error", "Failed.", static_cast<Btn>(Ok)); dialog.exec_(); break; } } }
-
#ifndef CMESSAGEBOX_H #define CMESSAGEBOX_H #include <QDialog> namespace Ui { class CMessageBox; } enum Mode { Information = 1, Warning = 2, Question = 3, Critical = 4 }; enum Btn { Yes = 0x01, No = 0x02, Ok = 0x04, Cancel = 0x08 }; class CMessageBox : public QDialog { Q_OBJECT public: explicit CMessageBox(QWidget *parent = nullptr); ~CMessageBox(); void setMessage(Mode modemsg, const QString &title, const QString &message, Btn modeBtn); void setIcon(const QString &iconPath); void addButton(const QString &text, Btn (CMessageBox::*handler)()); Btn PushOk(); Btn PushCancel(); Btn PushYes(); Btn PushNo(); Btn exec_(); private: Ui::CMessageBox *ui; Btn result_value; }; #endif // CMESSAGEBOX_H
#include "cmessagebox.h" #include "ui_cmessagebox.h" #include <QFrame> #include <QPushButton> CMessageBox::CMessageBox(QWidget *parent) : QDialog(parent), ui(new Ui::CMessageBox) { ui->setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); //this->setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint); ui->frame->setFrameShape(QFrame::StyledPanel); ui->frame->setFrameShadow(QFrame::Raised); } CMessageBox::~CMessageBox() { delete ui; } void CMessageBox::setMessage(Mode modemsg, const QString &title, const QString &message, Btn modeBtn) { ui->msg->setText(message); this->setWindowTitle(title); ui->horizontalLayout_2->addItem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); if (modeBtn & Yes) addButton("Yes", &CMessageBox::PushYes); if (modeBtn & Ok) addButton("OK", &CMessageBox::PushOk); if (modeBtn & No) addButton("No", &CMessageBox::PushNo); if (modeBtn & Cancel) addButton("Cancel", &CMessageBox::PushCancel); ui->horizontalLayout_2->addItem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); int labelWidth = ui->msg->sizeHint().width(); int labelHeight = ui->msg->sizeHint().height(); setFixedWidth(labelWidth + 70); if (labelHeight > 39) { setFixedHeight(labelHeight + 64); } else { setFixedHeight(107); } switch (modemsg) { case Information: setIcon(":/img/messagebox-asterisk.png"); break; case Warning: setIcon(":/img/messagebox-exclamation.png"); break; case Question: setIcon(":/img/messagebox-question.png"); break; case Critical: setIcon(":/img/cross.png"); break; default: break; } } void CMessageBox::addButton(const QString &text, Btn (CMessageBox::*handler)()) { QPushButton *pushButton = new QPushButton(ui->frame); pushButton->setMinimumWidth(75); pushButton->setMaximumWidth(23); pushButton->setText(text); ui->horizontalLayout_2->addWidget(pushButton); connect(pushButton, &QPushButton::clicked, this, handler); } void CMessageBox::setIcon(const QString &iconPath) { ui->icn->setStyleSheet("image: url(" + iconPath + ");"); QApplication::beep(); } Btn CMessageBox::PushOk() { result_value = Ok; accept(); return result_value; } Btn CMessageBox::PushCancel() { result_value = Cancel; accept(); return result_value; } Btn CMessageBox::PushYes() { result_value = Yes; accept(); return result_value; } Btn CMessageBox::PushNo() { result_value = No; accept(); return result_value; } Btn CMessageBox::exec_() { QDialog::exec(); return result_value; }
-
@Blackzero said in call the dialog inside the loop:
but when the dialog appears the application becomes "Not responding"
But does the dialog work?
You're using exec() which means you're using the dialog as a modal dialog - the application is blocked until the dialog is closed.