как правильно закрыть диалоговое окно

231
12 декабря 2021, 01:10

Открываю диалоговое окно:

ManualSetting * dialog = new ManualSetting(threadbalancerautomode,0);
dialog->setModal(true);
dialog->setWindowFlags(Qt::FramelessWindowHint);
dialog->exec();

Закрываю окно:

QWidget::close();

Проблема иногда, довольно часто, в том, что окно не закрывается и приходиться повторно вызывать QWidget::close(). Хотя QWidget::close() возвращает true - нажимаешь на кнопку "Закрыть", а оно висит. Нажимаешь второй раз и окно закрывается:

#include "manualsetting.h"
#include "ui_manualsetting.h"
ManualSetting::ManualSetting(ThreadBalancerAutoMode *const threadbalancerautomode, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ManualSetting),
    threadbalancerautomode(threadbalancerautomode)
{
    ui->setupUi(this);
    setWindowModality(Qt::WindowModal);
}
ManualSetting::~ManualSetting()
{
    delete ui;
}
void ManualSetting::on_pushButton_8_released()
{
    QWidget::close();
}
#ifndef MENU_1_H
#define MENU_1_H
#include <QDialog>
#include <threadbalancerautomode.h>
namespace Ui {
    class menu_1;
}
class menu_1 : public QDialog
{
    Q_OBJECT  
public:
    explicit menu_1(ThreadBalancerAutoMode * const  threadbalancerautomode, 
 QWidget *parent = 0);
    ~menu_1();
private slots:
    void on_pushButton_pressed();
    void on_pushButton_4_pressed();
    void on_pushButton_6_pressed();
    void on_pushButton_3_pressed();
    void on_pushButton_5_pressed();
    void on_pushButton_2_pressed();
private:
    Ui::menu_1 *ui;
    ThreadBalancerAutoMode * const threadbalancerautomode;
};
#endif // MENU_1_H

открываю окно

#include "menu_1.h"
#include "ui_menu_1.h"
#include <graphwindow.h>
#include <manualsetting.h>
menu_1::menu_1(ThreadBalancerAutoMode *const threadbalancerautomode, QWidget 
*parent) :
    QDialog(parent),
    ui(new Ui::menu_1),
    threadbalancerautomode(threadbalancerautomode)
{
    ui->setupUi(this);
    setWindowModality(Qt::WindowModal);
}
menu_1::~menu_1()
{
    delete ui;
}
void menu_1::on_pushButton_3_pressed()
{
    ManualSetting * dialog = new ManualSetting(threadbalancerautomode,0);
    dialog->setModal(true);
    dialog->setWindowFlags(Qt::FramelessWindowHint);
    dialog->exec();
}
Answer 1

Для закрытия модиального диалога QDialog надо использовать функции
QDialog::acept() - этот код возвращается, если пользователь нажал Ок в диалоге
QDialog::reject() - этот код возвращается, если пользователь нажал Cancel или закрыл диалог
QDialog::done(int) - это общий универсальный метод, где вы можете вернуть свой код возврата

void ManualSetting::on_pushButton_8_released()
{
    accept();
}

В вызывающем коде также возможно проверять с каким кодом завершился диалог

ManualSetting * dialog = new ManualSetting(threadbalancerautomode,0);
dialog->setModal(true);
dialog->setWindowFlags(Qt::FramelessWindowHint);
if (dialog->exec() == QDialog::Accepted)
{
    // Accept code
}
else
{
    // Reject code
}
READ ALSO
QT C++ Создание ISO-образа

QT C++ Создание ISO-образа

Появилась задача создать простую программу для создания ISO-образов с компакт-диска на C++Однако, в дебрях интернета несколько запутался и не смог...

237
Библиотека mpich

Библиотека mpich

такая проблема, есть программа, которая реализуется сортировку методом двухпутевого слияния, нужно при помощи библиотеки mpich реализовать...

216
Инициализация поля класса указателем С++

Инициализация поля класса указателем С++

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

122
Не выводит текст в файл

Не выводит текст в файл

Когда я нажимаю на кнопку считает, а в файл нечего не записывается искал много способов записи в файл, ругался на все кроме этогоcli c++

244