2011-12-01 3 views
2

두 개의 포인터를 QMap 객체에 매핑하여 관계를 저장하려고합니다. 값 포인터가 위젯을 가리키는 동안 키 포인터는 QTextBlock을 가리 킵니다. 목표는 QPlainTextEdit의 내용이 변경 될 때 QPlainTextEdit에서 QTextBlock의 위치를 ​​기준으로 위젯의 위치를 ​​업데이트하는 것입니다. 위젯은 QTextBlock이 파괴되면 파괴되어야합니다.QPlainTextEdit에서 QTextBlock에 대한 포인터 가져 오기

그러나 QPlainTextEdit에서 QTextBlock의 동작에 익숙하지 않습니다. firstVisibleBlock() 메서드는 QPlainTextEdit의 QTextBlock에 대한 포인터를 반환하지 않는 것 같지만 QPlainTextEdit 매개 변수의 QTextBlock을 사용하여 새 QTextBlock을 매개 변수로 만듭니다.

QTextBlock* CodeEditor::getBlockAtPosition(QPoint position) { 

    QTextBlock block = firstVisibleBlock(); 
    while (true) 
    { 
     QRectF blockDim = blockBoundingGeometry(block).translated(contentOffset()); 
     if (position.y() <= blockDim.bottom() && position.y() >= blockDim.top()) 
     { 
      break; 
     } 
     else if (block.blockNumber() + 1 < blockCount()) 
     block = block.next(); 
     else break; 
    } 
    return new QTextBlock (block); 
} 

음, 이것은 작동하는 것 같다 때문에 나는/입력 의도 한대로 포인터 변화 뒤에있는 객체의 속성을 반환 타격하여 QPlainTextEdit에 새로운 라인 (QTextBlocks)를 추가 할 때. 즉, 해당 블록 앞에 선을 삽입하면 blockNumber가 증가하고 지오메트리/위치가 변경됩니다.

그러나 관련 줄 (백 스페이스/델)을 삭제해도 포인터는 여전히 QPlainTextEdit의 QTextBlock을 가리 킵니다. 어떻게 또는 왜 그 이유가 없습니다. 포인터 값에 isValid() 메서드를 호출하면 true를 반환합니다.

그렇다면 새로운 QTextBlock 객체 인 이유는 무엇입니까? QPlainTextEdit에서 직접 포인터 또는 QTextBlock에 대한 참조를 가져 오는 방법이 있습니까?

+0

"매달려있는"QTextBlock에 insertText()를 시도 했습니까? QTextBlock :: isVisible 속성을 확인 했습니까? – ibizaman

답변

0

나는 이것이 오래된 질문이라는 것을 알고 있지만 비슷한 문제에 대한 해결책을 찾고있는 중에 발견 한 것이므로 앞으로 발견 한 내용과 관련이있을 수있는 문서에 답하고 있습니다.

삽입 편집/다른 줄 삭제시에도 특정 줄에 묶여있는 외부 마커를 부착하려고했습니다. 문제는 마커에 첨부 된 선이 삭제 된 경우에도 블록 객체가 다시 사용 되었기 때문에 마커가 잘못된 위치로 이동했기 때문입니다.

이 솔루션은 텍스트 블록의 사용자 데이터 기능을 사용했습니다. 블록이 "삭제"되고 재사용되면 사용자 데이터가 제거됩니다. 따라서 내 마커는 QTextBlockUserData에서 상속 받고 마커를 블록의 사용자 데이터로 설정하고 마커에서 블록에 대한 참조를 보유합니다. 그런 다음 유효성 테스트는 단순히 마커 객체와 블록이 보유한 사용자 데이터를 비교하는 것입니다. 일하는 것 같습니다.

관련 문제