2013-12-11 4 views
3

QTableView :: setModel()에 대한 호출을 사용하여 QAbstractTableModel에서 상속 한 내 자신의 사용자 지정 모델을 설정하는 QTableView를 사용하고 있습니다.Qt : 동일 창 또는 다른 창에서 드래그를 구분합니다.

테이블 뷰는 끌어서 놓기를 지원합니다. my model 클래스는 mimeData() 및 dropMimeData()를 다시 구현합니다. 응용 프로그램의 두 인스턴스간에 항목을 드래그 앤 드롭 할 수 있습니다.

달성하고자하는 것은 dropMimeData()는 떨어 뜨린 요소가 같은 창 또는 다른 응용 프로그램 실행중인 다른 창에서 제공되는지 여부를 감지해야합니다. 그리고 그것은 각 경우에 다르게 행동해야합니다.

dropMimeData()의 Qt :: DropAction 동작을 사용하는 것이 가장 자연스러운 것처럼 보였지만 작동하지 않습니다. 원래 창과 관계없이 항상 Qt :: CopyAction 또는 Qt :: MoveAction입니다. QTableView의 defaultDropAction에 있습니다.

이것이 가능합니까?

protected: 
bool eventFilter(QObject *target, QEvent *event); 

를 추가하는 기능이 이미 선언되지 않은 경우, mainwindow.h에 다음 사항을 추가
ui->tableView1ui->tableView2

:

+1

해당 정보를 MIME 데이터로 인코딩하고 항목을 삭제할 때 디코딩하면 어떻게 될까요? – vahancho

+0

원래 윈도우의 시스템 전체 고유 식별자가 필요합니다. 그런 것이 있습니까? – user377486

+0

나는 생각보다 간단합니다 - 그냥 귀하의 식별자 (들)을 발명하고 바이트 배열 또는 기타로 MIME 데이터에 쓸 수 있습니다. – vahancho

답변

0

나는 ... 형태로 테이블을 마우스 오른쪽 버튼으로 클릭 QT 디자이너에서 수행 할 수 있습니다 QTableView를 서브 클래 싱하고 홍보 을 선택 끝났다 - 나는 adlag의 제안에 따라 서브 클래스에서인지 감지 할 dropEvent->source()을 사용 근원은 동일한 도구 또는 다른 것이었다.

1

QMainWindow 예를 MainWindow를가 childeren 등이 개 QTableView 인스턴스를 가지고 있다고 가정 구현 파일의 생성자를 따라 가십시오.

ui->tableView1->viewport()->installEventFilter(this); 
ui->tableView2->viewport()->installEventFilter(this); 

(함수가 이미 블록 경우 별도의 추가 존재하는 경우)

bool MainWindow::eventFilter(QObject * target, QEvent *event) 
{ 
    if (event->type() == QEvent::Drop) { 
     QDropEvent *dropEvent = (QDropEvent*) event; 
     // pointer target is the target and 
     // pointer dropEvent->source() is the source 
     if (target == ui->tableView1->viewport()) { 
      // .... 
     } 
     if (target == ui->tableView2->viewport()) { 
      // ... 
     } 
    } 
    return false; //leave further processing to widget 
} 

당신은 또한 QDragMoveEvent을 차단할 수 있도록 구현 파일 mainwindow.cpp
에 다음 함수를 추가합니다. 포인터 targetevent->source()을 분석하면 어디로 가고 어디서 왔는지 알 수 있습니다.