QDialog派生表格立即关闭

时间:2011-05-23 01:04:21

标签: c++ qt

我试图在thr主窗体上单击按钮时显示一个带有数据表的表单。然而,在实践中,第二种形式“眨眼” - 看起来不到第二种 - 然后消失了。可能是什么原因以及如何解决这个问题?

以下是派生表单标题和源文件的内容:

#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 个答案:

答案 0 :(得分:7)

问题是,您在on_goodTable_clicked方法中的堆栈上有一个本地对话框对象。因此,您创建view,调用show,显示对话框并立即返回,然后在您离开函数时销毁view get。如果您仍然使用对话框模态,为什么不使用QDialog的{​​{1}}方法exec。它显示对话框并阻止主窗口,直到您单击对话框的确定​​或取消按钮,然后show最终返回。如果需要非模态对话框(意味着主窗口工作,对话框打开),则需要动态创建对话框(或使其成为主窗口的成员,或两者都有)。