문제

내 앱에는 QSplitter로 분할된 창이 있는데 위젯을 제거해야 합니다.

어떻게 해야 합니까?유용한 방법을 찾을 수 없습니다

도움이 되었습니까?

해결책

QT의 많은 것들은 "전통적으로"제거 될 수 없습니다. 대신 Hide ()를 호출하여 파괴하십시오. 에서 qsplitter 선적 서류 비치:

어린이를 숨길 때 ()는 다른 어린이들에게 공간이 배포됩니다. 당신이 그것을 다시 show () 할 때 복원됩니다.

다른 팁

위젯을 보존하고 다른 곳에두고 싶거나 위젯을 파괴하려는 경우 나에게 명확하지 않습니다.

  • 위젯 파괴 : 위젯에 대한 포인터를 얻을 수 있다면 간단히 삭제할 수 있습니다. 스플리터는 아이가 삭제되고 있다는 사실을 안전하게 알리고 스스로를 제거 할 것입니다.

  • 위젯 보존 : 위젯에 대한 포인터를 잡으면 부모를 다른 위젯으로 설정하고 다른 위젯의 레이아웃에 추가하면 표시됩니다. QSPLITER가 자녀 중 한 명이 채우기를 알게되기 때문에 안전합니다.

부모를 NULL (CJHUITT의 답변)으로 설정하려면 위젯에 더 이상 부모가 없기 때문에 해당 메모리를 정리할 책임이 있음을 알고 계십시오.

나는 Tuminoid의 대답을 좋아합니다. 그러나 절대적으로 제거해야한다면 제거하려는 위젯을 가져 와서 setParent( NULL ) 그 위젯에. 그게 내 최고의 추측입니다.

위젯에 대한 포인터를 갖고 있다면 그냥 삭제하거나, 안전을 원할 경우 deleteLater()를 사용하세요.

위젯 포인터가 없으면 QSplitter::widget(int index) 함수를 사용하십시오.그런 다음 해당 deleteLater() 슬롯을 호출할 수 있습니다.

위젯 색인이 없지만 위젯 objectName()을 여전히 알고 있다면 QObject::findChild()가 위젯 포인터를 얻는 유일한 방법입니다.

나는 같은 문제에 부딪쳤다. QT 4.8에서 QSPlitter의 위젯 중 하나를 일시적으로 숨기려면 간단히 숨 깁니다. 그러나 스플리터 핸들을 여전히 이동할 수 있으므로 충분하지 않습니다. 그러나 핸들에 액세스하고 숨겨 질 수도 있습니다.

frameA->setVisible(conditionA);
frameB->setVisible(conditionB);
if ( !(conditionA && conditionB) ) // if only 1 frame is visible
{
   splitter->handle(0)->setVisible(false);
}

자식 위젯이 삭제되는 것을 방지하는 또 다른 쉬운 방법은 QSplitter.takeWidget (child)을 사용하는 것입니다. 이것은 또한 스플리터에서 위젯을 제거하는 권장되는 방법입니다. (QT 문서)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top