隐藏窗口时Qt退出

时间:2013-10-23 14:55:12

标签: c++ qt

我有一个MainWindow,它在构造函数中调用LoginWindow。 LoginDialog有一个创建帐户的按钮,可以创建QDialog

我希望在显示新帐户的对话框时隐藏LoginDialog,但不知何故它会崩溃。

当我删除隐藏的函数的第一行和最后一行并显示LoginDialog时,它绝对没问题。为什么会因hide()show()而导致崩溃?

void LoginDialog::createAccount()
{
    // (-> will cause crash later) hide(); //Hides LoginDialog
    QDialog dlg;
    dlg.setGeometry( this->x(), this->y(), this->width(), this->height() );

    QWidget* centralWidget = new QWidget( &dlg );
    QVBoxLayout* l = new QVBoxLayout( centralWidget );
    dlg.setLayout( l );

    QLineEdit *dlgUser = new QLineEdit( centralWidget );
    QLineEdit *dlgPass = new QLineEdit( centralWidget );
    dlgPass->setEchoMode( QLineEdit::Password );

    l->addWidget( new QLabel( tr("Username :"), centralWidget ) );
    l->addWidget( dlgUser );
    l->addWidget( new QLabel( tr("Password :"), centralWidget ) );
    l->addWidget( dlgPass );
    l->addWidget( new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, centralWidget ) );

    if( dlg.exec() != QDialog::Rejected )
    {
        ;
    }
    delete centralWidget;
    // (-> will cause crash later) show(); //Show LoginDialog again
}

没有错误,它只是意外崩溃,有时它会以代码(0)退出。

使用调试器进行分析并真正完成每一步时,它不会崩溃。 LoginDialog将会显示,并且不会崩溃。

1 个答案:

答案 0 :(得分:0)

我在对话框中没有达到centralWidget的目的?我认为根本不需要它,你可以直接在对话框中组装你的小部件。我会用这种方式重写你的代码:

void LoginDialog::createAccount()
{
    QDialog dlg;
    dlg.setGeometry( this->x(), this->y(), this->width(), this->height() );

    QLineEdit *dlgUser = new QLineEdit( &dlg );
    QLineEdit *dlgPass = new QLineEdit( &dlg );
    dlgPass->setEchoMode( QLineEdit::Password );

    QVBoxLayout* l = new QVBoxLayout;
    l->addWidget( new QLabel( tr("Username :"), &dlg ) );
    l->addWidget( dlgUser );
    l->addWidget( new QLabel( tr("Password :"), &dlg ) );
    l->addWidget( dlgPass );
    l->addWidget( new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &dlg ) );

    dlg.setLayout( l );

    if( dlg.exec() != QDialog::Rejected )
    {
        // Do something.
    }
}