2010-04-05 3 views
1

탭 위젯에 QPlainTextEdit이있는 Qt 애플리케이션이 있습니다. 시도 문서() 메소드를QPlainTextEdit 세분화 오류

w->document() 

그것을

QPlainTextEdit *w = (QPlainTextEdit*)ui->tabWidget->widget(0) 

에 대한 포인터를 만들고 호출 할 때 나는 세그먼트 폴트를 얻을.

하지만 직접 문서를 호출하는 경우 (예 : ui-> mainEdit-> document()를 실행하면 모든 것이 잘 동작합니다.

아무도 왜 나에게 설명 할 수 있습니까?

+0

내 생각에 tabWidget-> widget (0)은 NULL을 반환합니다. 적절한 내용으로 채워진 tabWidget 뒤에 "w = ..."를 수행 하시겠습니까? – ony

답변

0

저는 거의 확실합니다. ui->tabWidget->widget(0) tabWidget 안에 컨테이너 위젯을 반환하십시오. 시도하십시오 qDebug() << ui->tabWidget->widget(0)->metaObject()->className() 및 인쇄 된 참조하십시오. 아마도 "QPlainTextEdit"이 아닌 "QWidget"일 것입니다. 귀하의 편집 내용은이 위젯의 ​​레이아웃 안에 있습니다.

0

qobject_cast를 사용하여 올바른 유형을 반환 할 수 있습니다.

QPlainTextEdit *w = qobject_cast<QPlainTextEdit*>(ui->tabWidget->widget(0)); 
if (w) 
{ 
... 
} 

유형이 QPlainTextEdit *이 아닌 경우 0을 반환합니다.

위와 같이 위젯 (0)은 사용자가 원하는 것을 반환하지 않고 컨테이너 나 다른 항목을 포함하고있을 가능성이 있으며 다른 방법이없는 한 위젯에 액세스하려는 방식이 아닐 수 있습니다.

QPlainTextEdit *w = ui->mainEdit; 

을 그리고 W-> 문서를() 당신이 원하는 반환합니다

1

당신은하고 싶지. ui-> tabWidget-> widget (0);을 캐스팅 할 때 세그먼트 화 오류가 발생합니다. 탭 페이지 객체에 대한 포인터를 제공합니다. 이것을 QPlainTextEdit *로 캐스팅하면 프로그램이 QPlainTextEdit를 나타내지 않는 메모리 부분을 QPlainTextEdit로 처리하도록 지시합니다. 이것은 액세스하려고하는 메모리 위치에 있기 때문에 w-> document()를 호출 할 때 문제가 발생합니다. QPlainTextEdit에 속한 메모리에서 기대할 수있는 것이 아니기 때문입니다.