QTextEdit-QCursor 위치에 따른 조건부 드래그 앤 드롭

후진

텍스트가있는 QTextEdit가 있습니다. 사용자는 startPos변수에 저장된 QCursor 위치에서 문서 끝까지 만 텍스트를 변경할 수 있습니다. 텍스트의 시작 부분은 동일해야합니다. 나는 QCursor 위치를 조절함으로써 그렇게 할 수있었습니다.

그러나 사용자는 언제든지 금지 된 영역에 텍스트를 끌어다 놓을 수 있습니다. QCursor 위치에 따라 조건부 드래그 앤 드롭을 만들고 싶습니다. 따라서 사용자가 금지 된 영역 (커서 위치 앞 startPos)에 텍스트를 놓으면 문서 끝에 해당 텍스트를 배치하고 싶습니다. 그리고 사용자가 커서 위치 뒤에 텍스트를 드롭하면 사용자 startPos가 그렇게 할 수 있습니다.

class BasicOutput : public QTextEdit, public ViewWidgetIFace
{
  Q_OBJECT
 public:
  BasicOutput();
  ~BasicOutput();

  virtual void dragEnterEvent(QDragEnterEvent *e);
  virtual void dropEvent(QDropEvent *event);

 private:
  int startPos;
};

나머지 단순화 된 (비 기능적) 코드 :

BasicOutput::BasicOutput( ) : QTextEdit () {
    setInputMethodHints(Qt::ImhNoPredictiveText);
    setFocusPolicy(Qt::StrongFocus);
    setAcceptRichText(false);
    setUndoRedoEnabled(false);
}


void BasicOutput::dragEnterEvent(QDragEnterEvent *e){
    e->acceptProposedAction();
}

void BasicOutput::dropEvent(QDropEvent *event){
    QPoint p = event->pos(); //get position of drop
    QTextCursor t(textCursor()); //create a cursor for QTextEdit 
    t.setPos(&p);  //try convert QPoint to QTextCursor to compare with position stored in startPos variable - ERROR

//if dropCursorPosition <  startPos then t = endOfDocument
//if dropCursorPosition >= startPos then t remains the same


    p = t.pos();  //convert the manipulated cursor position to QPoint  - ERROR
    QDropEvent drop(p,event->dropAction(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers(), event->type());
    QTextEdit::dropEvent(&drop); // Call the parent function w/ the modified event
}

오류는 다음과 같습니다.

In member function 'virtual void BasicOutput::dropEvent(QDropEvent*)':
error: 'class QTextCursor' has no member named 'setPos' t.setPos(&p);
error: 'class QTextCursor' has no member named 'pos'p = t.pos();

사용자 드래그 앤 드롭으로부터 금지 된 텍스트 영역을 보호하는 방법은 무엇입니까?

정중하게, 플로린.


최종 코드

void BasicOutput::dragEnterEvent(QDragEnterEvent *e){
    if (e->mimeData()->hasFormat("text/plain"))
        e->acceptProposedAction();
    else
        e->ignore();
}

void BasicOutput::dragMoveEvent (QDragMoveEvent *event){
  QTextCursor t = cursorForPosition(event->pos());
  if (t.position() >= startPos){
      event->acceptProposedAction();
      QDragMoveEvent move(event->pos(),event->dropAction(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers(), event->type());
      QTextEdit::dragMoveEvent(&move); // Call the parent function (show cursor and keep selection)
  }else
      event->ignore();
}
GM

현재 ...

QTextCursor t(textCursor()); //create a cursor for QTextEdit 
t.setPos(&p);

제안 된 드롭 위치와 관련된 QTextCursor를 원한다면 사용해야합니다 ...

QTextCursor t = cursorForPosition(p);

첫 번째 컴파일 오류를 수정해야합니다. 불행히도 QTextCursor와 연결된 QPoint를 얻는 확실한 방법이없는 것 같습니다 (QTextDocument 및 QTextBlock을 통해가는 방법이있을 수 있지만 확인하지 않았습니다). 그렇다면 직접 드롭을 수행해야합니다 ...

if (t.position() < startPos)
  t.movePosition(QTextCursor::End);
setTextCursor(t);
insertPlainText(event->mimeData()->text());

그러나 당신이하려는 일이 사용자에게 매우 혼란 스러울 수 있다고 제안 할 수 있습니다. 텍스트를 드롭하면 어떤 일이 발생할 지에 대한 시각적 표시가 있어야합니다. 금지 된 영역에 텍스트를 놓으면 현재 텍스트의 끝에 추가된다는 것을 사용자가 어떻게 알 수 있습니까? 큰 문서에서는 보이지 않을 수도 있습니다.

이를 염두에두고 더 나은 방법은 dragMoveEvent를 재정의하는 것입니다 ...

void BasicOutput::dragMoveEvent (QDragMoveEvent *event)
{
  QTextCursor t = cursorForPosition(p);
  if (t.position() >= startPos)
    event->acceptProposedAction();
}

여기서 제안 된 드롭 동작은 마우스 포인터가 금지 된 영역에없는 경우에만 허용됩니다. 그렇지 않으면 사용자는 드롭이 허용되지 않는다는 것을 (포인터 글리프 등을 통해) 보게됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

드래그 앤 드롭 위치에 따라 Firestore에서 문서 주문

분류에서Dev

스택 카드의 조각에서 Android 드래그 앤 드롭

분류에서Dev

kinetic.stage에서 다른 단계로 드래그 앤 드롭

분류에서Dev

그리드 클래스 내부의 드래그 앤 드롭에서 잘못된 마우스 위치

분류에서Dev

부정적인 위치를 적용하는 드래그 앤 드롭

분류에서Dev

WPF에서 TabItems 드래그 앤 드롭?

분류에서Dev

RaphaelJS에서 드래그 앤 드롭

분류에서Dev

VirtualTreeView에서 쉘로 드래그 앤 드롭 (Ole 드래그 앤 드롭)

분류에서Dev

한 양식에서 다른 양식의 원하는 위치로 드래그 앤 드롭

분류에서Dev

드래그 앤 드롭 반응 : Div, 드래그 거부

분류에서Dev

레벨에서 다른 레벨로 드래그 앤 드롭 비활성화

분류에서Dev

이미지에서 다른 이미지로 드래그 앤 드롭

분류에서Dev

jQuery 드래그 앤 드롭에서 드롭 영역 필터링

분류에서Dev

한 목록에서 드래그 앤 드롭으로 복사하지만 내부 드래그 앤 드롭에는 이동을 사용하는 방법

분류에서Dev

드래그 앤 드롭은 jQuery Plus Plus에서 부모로 제한됩니다.

분류에서Dev

외부에서 녹아웃 정렬 가능한 드래그 앤 드롭

분류에서Dev

드래그 앤 드롭 위치 가져 오기

분류에서Dev

Electronjs 드래그 앤 드롭

분류에서Dev

드래그 앤 드롭, 드래그 요소 ID 및 ID를 놓을 위치

분류에서Dev

데이터베이스의 각도 드래그 앤 드롭 저장 위치 및 화면 크기 조정 문제

분류에서Dev

안드로이드에서 트 리뷰 드래그 앤 드롭

분류에서Dev

Android Studio에서 드래그 앤 드롭으로 절대 위치 지정

분류에서Dev

드래그 앤 드롭 후 RecyclerView 항목의 새 위치를 SQLite에 저장

분류에서Dev

부드러운 드래그 앤 드롭 전환

분류에서Dev

jQuery 드래그 앤 드롭 div로 다른 이미지 변경

분류에서Dev

다른 행을 먹는 ListView 드래그 앤 드롭 Android

분류에서Dev

드래그 앤 드롭 목록의 올바른 순서 확인

분류에서Dev

Android 드래그 앤 드롭 ImageView를 다른 ImageView로

분류에서Dev

바쁜 프로그램에서 드래그 앤 드롭 중단

Related 관련 기사

  1. 1

    드래그 앤 드롭 위치에 따라 Firestore에서 문서 주문

  2. 2

    스택 카드의 조각에서 Android 드래그 앤 드롭

  3. 3

    kinetic.stage에서 다른 단계로 드래그 앤 드롭

  4. 4

    그리드 클래스 내부의 드래그 앤 드롭에서 잘못된 마우스 위치

  5. 5

    부정적인 위치를 적용하는 드래그 앤 드롭

  6. 6

    WPF에서 TabItems 드래그 앤 드롭?

  7. 7

    RaphaelJS에서 드래그 앤 드롭

  8. 8

    VirtualTreeView에서 쉘로 드래그 앤 드롭 (Ole 드래그 앤 드롭)

  9. 9

    한 양식에서 다른 양식의 원하는 위치로 드래그 앤 드롭

  10. 10

    드래그 앤 드롭 반응 : Div, 드래그 거부

  11. 11

    레벨에서 다른 레벨로 드래그 앤 드롭 비활성화

  12. 12

    이미지에서 다른 이미지로 드래그 앤 드롭

  13. 13

    jQuery 드래그 앤 드롭에서 드롭 영역 필터링

  14. 14

    한 목록에서 드래그 앤 드롭으로 복사하지만 내부 드래그 앤 드롭에는 이동을 사용하는 방법

  15. 15

    드래그 앤 드롭은 jQuery Plus Plus에서 부모로 제한됩니다.

  16. 16

    외부에서 녹아웃 정렬 가능한 드래그 앤 드롭

  17. 17

    드래그 앤 드롭 위치 가져 오기

  18. 18

    Electronjs 드래그 앤 드롭

  19. 19

    드래그 앤 드롭, 드래그 요소 ID 및 ID를 놓을 위치

  20. 20

    데이터베이스의 각도 드래그 앤 드롭 저장 위치 및 화면 크기 조정 문제

  21. 21

    안드로이드에서 트 리뷰 드래그 앤 드롭

  22. 22

    Android Studio에서 드래그 앤 드롭으로 절대 위치 지정

  23. 23

    드래그 앤 드롭 후 RecyclerView 항목의 새 위치를 SQLite에 저장

  24. 24

    부드러운 드래그 앤 드롭 전환

  25. 25

    jQuery 드래그 앤 드롭 div로 다른 이미지 변경

  26. 26

    다른 행을 먹는 ListView 드래그 앤 드롭 Android

  27. 27

    드래그 앤 드롭 목록의 올바른 순서 확인

  28. 28

    Android 드래그 앤 드롭 ImageView를 다른 ImageView로

  29. 29

    바쁜 프로그램에서 드래그 앤 드롭 중단

뜨겁다태그

보관