0

我有一个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显示,它不会崩溃。

4

1 回答 1

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.
    }
}
于 2013-10-23T15:04:06.810 回答