드래그 앤 드롭 기술 1

드래그 앤 드롭은 DnD라고도 불리는 현대 소프트웨어 개발에서 없어서는 안 될 기술이다.이것은 응용 프로그램 내부, 심지어 응용 프로그램 간에 정보 교환을 할 수 있는 메커니즘을 제공하고 운영체제와 응용 프로그램 간에 클립보드의 내용 교환을 할 수 있으며 DnD의 일부로 여겨질 수도 있다.
DnD는 사실 두 부분으로 구성되어 있는데 그것이 바로 Drag과 Drop이다.드래그는 드래그 앤 드롭 객체를'드래그'하고, 드롭은 드래그 앤 드롭 객체를'드롭'하며, 전자는 마우스를 누르는 과정이고, 후자는 마우스를 놓는 과정으로 둘 사이에 마우스가 계속 눌려 있다.물론 이것은 일반적인 상황일 뿐이고 다른 상황은 응용 프로그램의 구체적인 실현에 달려 있다.Qt의 경우widget은drag의 대상일 수도 있고drop의 대상일 수도 있고 둘 다일 수도 있다.
다음 예는 C++ GUI Programming with Qt 4, 2nd Edition에서 나온 것입니다.이 예에서 시스템의 텍스트 파일을 끌어다 놓고 창에서 내용을 읽을 수 있는 프로그램을 만듭니다.
mainwindow.h

  
  
  
  
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.  
  4. #include <QtGui>  
  5.  
  6. class MainWindow : public QMainWindow  
  7. {  
  8.     Q_OBJECT  
  9.  
  10. public:  
  11.     MainWindow(QWidget *parent = 0);  
  12.     ~MainWindow();  
  13.  
  14. protected:  
  15.     void dragEnterEvent(QDragEnterEvent *event);  
  16.     void dropEvent(QDropEvent *event);  
  17.  
  18. private:  
  19.     bool readFile(const QString &fileName);  
  20.     QTextEdit *textEdit;  
  21. };  
  22.  
  23. #endif // MAINWINDOW_H 

mainwindow.cpp
#include "mainwindow.h" 
  •  

  • MainWindow::MainWindow(QWidget *parent)  
  •     : QMainWindow(parent)  

  • {  
  •     textEdit = new QTextEdit;  

  •     setCentralWidget(textEdit);  
  •  

  •     textEdit->setAcceptDrops(false);//QTextEdit의 드래그 앤 드롭 수신 해제
  •     setAcceptDrops(true);//주 창의 드래그 앤 드롭 수신 열기
  •  
  •     setWindowTitle(tr("Text Editor"));  

  • }  
  •  

  • MainWindow::~MainWindow()  
  • {  

  • }  
  •  

  • void MainWindow::dragEnterEvent(QDragEnterEvent *event)  
  • {  

  • if(event->mimeData()->hasFormat("text/uri-list")) {//이벤트를 감지하는 mimeData
  •         event->acceptProposedAction();  

  •     }  
  • }  

  •  
  • void MainWindow::dropEvent(QDropEvent *event)  

  • {  
  •     QList urls = event->mimeData()->urls();  

  •     if (urls.isEmpty()) {  
  •         return;  

  •     }  
  •  

  •     QString fileName = urls.first().toLocalFile();  
  •     if (fileName.isEmpty()) {  

  •         return;  
  •     }  

  •  
  •     if (readFile(fileName)) {  

  •         setWindowTitle(tr("%1 - %2").arg(fileName, tr("Drag File")));  
  •     }  

  • }  
  •  

  • bool MainWindow::readFile(const QString &fileName)  
  • {  

  •     bool r = false;  
  •     QFile file(fileName);  

  •     QTextStream in(&file);  
        if(file.open(QIODevice::ReadOnly|QFile::Text)) {  
  •         textEdit->setText(in.ReadAll());  
  • r=true;
  •     }  

  •         return r;  

    main.cpp
    
      
      
      
      
    1. #include <QtGui/QApplication>  
    2. #include "mainwindow.h"  
    3.  
    4. int main(int argc, char *argv[])  
    5. {  
    6.     QApplication a(argc, argv);  
    7.     MainWindow w;  
    8.     w.show();  
    9.     return a.exec();  

    이곳의 코드는 결코 매우 복잡하지 않다.MainWindow에서 창 중간의widget으로 QTextEdit을 사용합니다.이 클래스에는 두 개의 보호된 함수가 있습니다.
    drag Enter Event () 와drop Event (), 이 두 함수는 모두 QWidget에서 계승된 것으로, 이름만 봐도 signal이 아닌 두 이벤트임을 알 수 있다.
    구조 함수에서 QTextEdit의 객체를 작성했습니다.기본적으로 QTextEdit는 다른 프로그램에서 끌어온 텍스트 형식의 정보를 받아들일 수 있습니다.만약 사용자가 파일을 여기에 끌어다 놓으면, 파일 이름을 텍스트의 현재 위치에 삽입할 것입니다.그러나 파일 이름만 삽입하는 것이 아니라 Main Window에서 drop 이벤트를 처리하기를 원합니다. 따라서 QText Edit의 set Accept Drops () 함수를false로 설정하고, Main Window의 set Accept Drops () 를true로 설정하여,Main Window가drop 이벤트를 처리할 수 있도록 합니다.
    사용자가 구성 요소 위로 객체를 드래그하면 dragEnterEvent () 함수가 콜백됩니다.이벤트 처리 코드에서acceptProposeAction () 함수를 호출하면 드래그한 대상을 이 구성 요소에 놓을 수 있음을 사용자에게 암시할 수 있습니다.기본적으로 구성 요소는 드래그 앤 드롭을 허용하지 않습니다.만약 우리가 이러한 함수를 호출한다면 Qt는 자동으로 커서로 구성 요소에 대상을 놓을 수 있는지 여부를 알려 줍니다.여기에서, 우리는 사용자에게 창이 드래그를 받아들일 수 있다는 것을 알려주기를 희망합니다.따라서 드래그 앤 드롭의 MIME 유형을 먼저 확인합니다.MIME 유형은 일반적으로 URI 목록을 설명하는 데 사용되는 text/uri-list입니다.이러한 URI는 파일 이름이거나 URL 또는 기타 리소스 설명자일 수 있습니다.MIME 유형은 인터넷 Assigned Numbers Authority(IANA)에서 정의되며, Qt의 드래그 이벤트는 MIME 유형을 사용하여 드래그 객체의 유형을 판단합니다.MIME 유형에 대한 자세한 내용은 를 참조하십시오.http://www.iana.org/assignments/media-types/.
    사용자가 구성 요소 위에 객체를 놓으면 dropEvent () 함수가 리셋됩니다.우리는 QmimeData::urls () 를 사용하거나 QUrl의list를 사용합니다.보통 이런 드래그는 한 파일만 사용해야 하지만 여러 파일을 함께 드래그하는 것도 배제하지 않는다.따라서 이list가 비어 있는지 확인해야 합니다. 비어 있지 않으면 첫 번째를 꺼내십시오.성립되지 않으면 즉시 돌아간다.마지막으로 readFile () 함수를 호출해서 파일 내용을 읽습니다.읽기 작업에 관해서 우리는 이후의 장과 절에서 상세하게 설명할 것이며, 여기서는 더 이상 군말하지 않을 것이다.
    자, 이제 우리 애플릿의 설명이 끝났으니 효과를 시험해 봅시다!
    Qt는 드래그 및 드롭 아웃에 대해서도 다음과 같은 함수를 제공합니다.
    dragMoveEvent () 와 dragLeaveEvent () 는 대부분의 응용 프로그램에서 이 두 함수의 사용률이 훨씬 낮다.

    좋은 웹페이지 즐겨찾기