Znikajacy dialog w Qt5

0

Mam normalny dialog utworzony przez kreator i nic więcej. Chce go wyświetlić po kliknięciu pewnego przycisku.
Robie to w funkcji clicked() pewnego buttona:

Dialog *dial = new Dialog();
    dial->show();
    dial->exec();
    add_event(new BaseRemind(dial->getDate(), dial->getBasicMsg(),
                             dial->getEventType()));
    delete dial;
 

Niestety po zakończeniu pracy dialogu, główne okno (main window) również kończy pracę :/
Pomogło wykasowanie "exec" ale wtedy dialog pokazuje się na 1 sec i znika. Czy ktoś wie jak zrobić, aby dialog nie zamykał okna lub nie znikał ?

0
Dialog *dial = new Dialog(this) ; // w konstruktorze podajesz wskaźnik do MainWindow
dial -> exec() ;
0

zrobiłem tak i dalej jak zamknę okno dialogu to cały program kończy pracę

0

Pokaż kod klasy Dialog

0

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()
{
    this->eventType = ui->comboBox->itemText(ui->comboBox->currentIndex());
    this->basicMsg = ui->textEdit->toPlainText();
    this->date = ui->dateTimeEdit->dateTime();
}
 

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QDateTime>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

private:
    QString eventType;
    QString basicMsg;
    QDateTime date;

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

    QString getEventType() {return eventType;}
    QString getBasicMsg()  {return basicMsg;}
    QDateTime getDate()    {return date;}

private slots:
    void on_pushButton_clicked();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H
 

Wywolanie w innej klasie:

void ContextMenu::addNewEvent()
{
    Dialog *dial = new Dialog(mainHandler);
    dial->show();
    dial->exec();
    add_event(new BaseRemind(dial->getDate(), dial->getBasicMsg(),
                             dial->getEventType()));
    delete dial;
}
 

gdzie mainHandler to wskaznik na QMainWindow przekazany w konstruktorze MainWindow w ten sposób:

simpleTray = new ContextMenu(this);
0

Jak już podałeś w konstruktorze wskaźnik na MainWindow, to ten delete nie jest Ci już do niczego potrzebny. dial->show() również wywal i zostaw samo wywołanie exec().

0

@Lord Darkstorm dzięki za odpowiedź. Zrobiłem tak jak napisałeś i nadal to samo, gdy klikam krzyżyk zamykania dialogu zamyka się cała aplikacja

1

Bez delete pamięć zostanie uwolniona dopiero razem z zamknięciem MainWindow, a wywołanie z menu kontekstowego implikuje wielokrotne wywołanie. Albo zostaw delete, albo użyj po prostu zmiennej z automatycznym składowaniem¹.

Jeśli chodzi o główny problem, to w/g szybkiego googlowania Qt zamyka aplikację po zamknięciu ostatniego okna. Zapobiec temu możesz ustawiając QGuiApplication::quitOnLastWindowClosed ( http://qt-project.org/doc/qt-5/qguiapplication.html#quitOnLastWindowClosed-prop ).

¹automatic storage ⟶ http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=29

0

@kq ustawienie na false działa tak jak chciałem :) Dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1