2014-10-20 3 views
1

단일 창과 QStackedWidget 기반 탐색이 중앙 위젯으로 사용되는 간단한 데스크톱 응용 프로그램을 만듭니다.슬롯에서 중앙 위젯에 액세스 할 때 Segfault

시작시 응용 프로그램이 QStackedWidget에 위젯을 추가하고 사용자 상호 작용 후에 다른 위젯이 추가됩니다. 불행히도 단순히 위젯의 슬롯에서 QStackedWidget에 액세스하려고하면 segfault가 발생합니다.

MainWindow.cpp

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ui->centralWidget->addWidget(new LoginPage(this)); // centralWidget = QStackedWidget 
} 

void MainWindow::onLoginSuccess() 
{ 
    qDebug() << ui->centralWidget; 
} 

LoginPage.cpp 슬롯

void LoginPage::on_loginButton_clicked() 
{ 
    // Check stuff and all 

    ((MainWindow*)parent())->onLoginSuccess(); 
} 

이 오류에 onLoginSuccess() 결과에 간단한 디버그 :

Exception at 0x760f92a7, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)

나는 아무 t이 없다 루블은 다른 UI 요소를 슬롯에서 업데이트하기 때문에 여기에 무슨 문제가 있는지 알 수 없습니다. MainWindow::MainWindow에서

+0

parent()가 null이며 사용자가 확인하지 않는 것 같습니다. LoginPage의 생성자가 부모 매개 변수를 올바르게 처리합니까? – drescherjm

+0

또한이 신호/슬롯을 사용합니다. 나는 직접 호출 대신에 on_loginButton_clicked를 MainWindow :: onLoginSuccess()에 연결하는 것을 의미한다. – drescherjm

+0

부모가 null이 아니므로 단순히 문자열이나 다른 것을 디버깅하는 경우 메서드 호출이 실패하지 않습니다. signal/slot을 사용하는 것에 관해서는, 이것은 대부분의 로직을 실제로 이해하지 못하는'MainWindow'에 넣는 것을 의미합니다 ... – Jukurrpa

답변

2

:

ui->centralWidget->addWidget(new LoginPage(this)); // centralWidget = QStackedWidget 

addWidget이 LoginPage을 reparent 것입니다. 따라서 parent()는 실제로 QStackedWidget *이고 on_loginButton_clicked에서는 MainWindow * 캐스트가 잘못되었습니다.

+0

좋은 지적. 나는 qobject_cast <>를 사용한다. – drescherjm

+0

그게 다야, 고마워. 내가 C++과 Qt를 사용한 이후로 꽤 오래되었습니다 ... – Jukurrpa

+0

@Jukurrpa 나는 절대적으로 똑같은 것을 말했고 당신은 내가 옳지 않다라고 대답했고 나는 대답을 삭제했습니다. 내가 뭔가를 오해 했니? – Chernobyl