2013-10-23 5 views
0

생성자에서 LoginWindow를 호출하는 MainWindow이 있습니다. LoginDialog에는 QDialog을 생성하는 계정을 만드는 버튼이 있습니다.창을 숨길 때 Qt 종료

새 계정의 대화 상자가 표시되지만 어떻게 든 충돌이 발생하는 동안 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이 표시되며 충돌이 발생하지 않습니다.

답변

0

대화 상자에 centralWidget의 용도가 표시되지 않습니까? 나는 그것이 전혀 필요하지 않다고 생각하고 대화 상자에서 직접 위젯을 어셈블 할 수 있습니다. 나는 이런 방식으로 코드를 다시 작성합니다 : 계정을 만들어 다른 모달 자식 대화 상자를 열 때

이 @Davlog을 숨기고
+0

가, 아, 당신이 부모 대화 상자를 숨기기? 글쎄,'dlg.exec()'를 호출하는 대신'dlg.show()'를 호출하면 어떨까요? – Davlog

+0

표시 할 때 여전히 충돌

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. } } 
vahancho

+0

hmm ... if 문을 dlg.show()로 대체했지만 여전히 충돌합니다. – Davlog

관련 문제