QDialog-производная форма закрывается немедленно - PullRequest
2 голосов
/ 23 мая 2011

Я пытаюсь сделать так, чтобы форма с таблицей данных появлялась при нажатии кнопки на главной форме.Однако на практике вторая форма «мигает» - появляется меньше, чем на второй - и затем исчезает.В чем может быть причина и как это следует исправить?

Вот заголовок производной формы и содержимое исходных файлов:

#ifndef GOODTABLE_H
#define GOODTABLE_H

#include <QDialog>
#include <QSqlTableModel>
namespace Ui {
    class GoodTable;
}

class GoodTable : public QDialog
{
    Q_OBJECT

public:
    explicit GoodTable(QDialog *parent = 0);
    GoodTable(QDialog *parent,QSqlTableModel* model);
    ~GoodTable();

private:
    Ui::GoodTable *ui;
};

#endif // GOODTABLE_H

#include "goodtable.h"
#include "ui_goodtable.h"

GoodTable::GoodTable(QDialog *parent) :
    QDialog(parent),
    ui(new Ui::GoodTable)
{
    ui->setupUi(this);
}
GoodTable::GoodTable(QDialog *parent,QSqlTableModel* model) :
    QDialog(parent),
    ui(new Ui::GoodTable)
{
    ui->setupUi(this);
    ui->tableView->setModel(model);
}
GoodTable::~GoodTable()
{
    delete ui;
}

Код, создающий второе окно:

void MainWindow::on_goodTable_clicked()
{
    QSqlTableModel model;

    initializeGoodModel(&model);
    //! [4]
    GoodTable view(NULL,&model);
    view.setWindowFlags(Qt::Window);
    view.setWindowModality(Qt::ApplicationModal);
    view.show();
}

1 Ответ

7 голосов
/ 23 мая 2011

Проблема в том, что у вас есть локальный объект диалога в стеке в вашем методе on_goodTable_clicked.Таким образом, вы создаете view, вызываете show, который показывает диалоговое окно и сразу же возвращается, тогда ваш view get уничтожается при выходе из функции.Если вы все равно сделаете диалог модальным, почему бы не использовать метод QDialog exec intead of show.Он показывает диалог и блокирует главное окно до тех пор, пока вы не нажмете кнопку «ОК» или «Отмена» в диалоговом окне, а затем, наконец, вернется exec.Если вы хотите немодальное диалоговое окно (то есть ваше главное окно работает, когда диалоговое окно открыто), вам нужно динамически создать диалоговое окно (или сделать его членом основного окна, или обоих).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...