2011-01-04 41 views
9

Tôi đã hai QListWidget (list1 và List2)kéo Qt và thả giữa hai QListWidget

  • list1 sẽ có thể nhận được các mục từ list2
  • list1 sẽ có thể được tổ chức lại với một kéo nội bộ và thả
  • list2 sẽ có thể nhận được các mục từ list1

list1->setSelectionMode(QAbstractItemView::SingleSelection); 
list1->setDragEnabled(true); 
list1->setDragDropMode(QAbstractItemView::DragDrop); 
list1->viewport()->setAcceptDrops(true); 
list1->setDropIndicatorShown(true); 

ulist2->setSelectionMode(QAbstractItemView::SingleSelection); 
list2->setDragEnabled(true); 
list2->setDragDropMode(QAbstractItemView::InternalMove); 
list2->viewport()->setAcceptDrops(true); 
list2->setDropIndicatorShown(true); 

Tôi phải đặt list2 trên InternalMove nếu không, mục sẽ không bị xóa khi tôi kéo nó đến list1.

Và nếu tôi đặt list1 đến InternalMove tôi không thể thả thêm bất kỳ thứ gì nữa.

Tôi có phải viết chức năng kéo và thả của riêng mình để làm điều đó không?

Trả lời

11

Bạn có thể mở rộng QListWidget trọng dragMoveEvent phương pháp như dưới đây

#ifndef MYLISTWIDGET_HPP 
#define MYLISTWIDGET_HPP 

#include <QListWidget> 

class MyListWidget : public QListWidget { 

public: 
    MyListWidget(QWidget * parent) : 
     QListWidget(parent) {} 

protected: 
    void dragMoveEvent(QDragMoveEvent *e) { 
     if (e->source() != this) { 
      e->accept(); 
     } else { 
      e->ignore(); 
     } 
    } 
}; 

#endif // MYLISTWIDGET_HPP 

Bên trong thực hiện, chúng tôi kiểm tra nguồn gốc của sự kiện kéo và chúng tôi không chấp nhận (cho phép) thả các mục đến từ phụ tùng của chúng tôi riêng của mình.
Nếu bạn đang sử dụng QtDesigner, bạn có thể sử dụng Quảng cáo đến ... tùy chọn từ trình đơn ngữ cảnh khi bạn nhấp chuột phải vào QListWidget trên biểu mẫu của bạn. Bạn phải nhập tên của lớp mới của bạn (MyListWidget trong ví dụ của tôi) và bạn phải nhập tên của tệp tiêu đề mới, nơi lớp của bạn sẽ được khai báo (bạn có thể sao chép và dán mã ở trên vào tệp này).